Группировать по нескольким столбцам и подсчитывать

StackOverflow https://stackoverflow.com/questions/3208907

Вопрос

У меня есть Table1 и Table2 в виде IEnumerable<DataRow>.Обе таблицы имеют столбцы Column1 и Column2.

Я хотел бы сделать левое внешнее соединение Column1 и хотел бы получить количество строк, присутствующих в Table2 и загрузите записи в DataTable.

Я попробовал следующий запрос

var query = from p in Table1
            join q in Table2 on p.Field<string>("Column1") equals q.Field<string>("Column1") into pq
            from xyz in pq.DefaultIfEmpty()
            group xyz by new { Col1 = p.Field<string>("Column1"), Col2 = p.Field<string>("Column2") } into g
            select dtFinalData.LoadDataRow(new object[]
            {
                g.Key.Col1,
                g.Key.Col2,                               
                g.Count
            }, false);

Поскольку «g» представляет сгруппированные данные, g.count возвращает 1 для строк, которые не имеют записей в таблице 2.Я хотел бы вернуть «0» для этих строк.

Вход :

Таблица 1

Col1Val1       Col2Val1

Col1Val2       Col2Val2

Таблица 2

Col1Val1       Col2Val1

Col1Val1       Col2Val1

Текущий выход:

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    1

Ожидаемые результаты :

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    0

я посмотрел на LINQ — левое соединение, группировка и подсчет но я не смог применить то же самое в своем запросе...

Можете ли вы помочь мне исправить этот запрос?

Это было полезно?

Решение

let пусть будет так:

from p in Table1
let p1 = p.Field<string>("Column1")
let p2 = p.Field<string>("Column2") 
let qs = 
  from q in Table2
  where p1 == q.Field<string>("Column1")
  select q
let qCount = qs.Count()
select dtFinalData.LoadDataRow(new object[]
{
  p1,
  p2,
  qCount
}, false);

Поскольку я не присоединился, мне не нужно группироваться.Каждая строка результата соответствует строке в таблице Table1.


Вот решение GroupJoin:

from p in Table1 
let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
join q in Table2 on pkey equals
  new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
  into qs
select dtFinalData.LoadDataRow(new object[] 
{ 
  pkey.c1, 
  pkey.c2, 
  qs.Count() 
}, false); 

А вот решение для объединения и группы.

from p in Table1 
let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
join q in Table2 on pkey equals
  new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
  into right
from q in right.DefaultIfEmpty()
group q by pkey into g
select dtFinalData.LoadDataRow(new object[] 
{ 
  g.Key.c1, 
  g.Key.c2, 
  g.Count(q => q != null) 
}, false); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top