Группировать по нескольким столбцам и количеству
У меня есть 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 - Left Join, Group By и Count, но я не мог применить то же самое в моем запросе...
Можете ли вы помочь мне исправить этот запрос?
1 ответ
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);
Поскольку я не присоединился, мне не нужно группировать. Каждая строка результатов соответствует строке в таблице 1.
Вот решение 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);