Grupo por Várias Colunas e Contagem
-
13-09-2020 - |
Pergunta
Eu tenho Tabela1 e Tabela2, na forma de IEnumerable<DataRow>
.Ambas as tabelas têm colunas Column1
e Column2
.
Eu gostaria de fazer uma associação externa à esquerda em Column1
e gostaria de obter uma contagem das linhas presentes na Table2
e carregar os registros em um DataTable.
Eu tentei o seguinte consulta
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);
Desde o " g " representa os dados agrupados g.devolve a contagem de 1 para linhas que não tenham entradas na Tabela 2.Eu gostaria de voltar '0' para essas linhas.
Entrada :
Tabela 1
Col1Val1 Col2Val1
Col1Val2 Col2Val2
Tabela 2
Col1Val1 Col2Val1
Col1Val1 Col2Val1
Corrente De Saída :
Col1Val1 Col2Val1 2
Col2Val2 Col2Val2 1
Resultados Esperados :
Col1Val1 Col2Val1 2
Col2Val2 Col2Val2 0
Eu olhei para LINQ - Left Join, Group By e Contagem mas eu não poderia aplicar o mesmo na minha consulta ...
Você pode me ajudar a corrigir esta consulta ?
Solução
let
assim:
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);
Desde que eu não participe, não tenho grupo.Cada linha corresponde a uma linha na tabela 1.
Aqui está um GroupJoin solução:
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);
E aqui está uma Associação de Grupo e de solução.
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);