Groupe de Plusieurs Colonnes et le Comte
-
13-09-2020 - |
Question
J'ai Table1 et Table2 dans la forme de IEnumerable<DataRow>
.Les deux tableaux ont des colonnes Column1
et Column2
.
Je voudrais faire une jointure externe gauche sur Column1
et souhaitez obtenir un nombre de lignes présentes dans Table2
et de charger les enregistrements dans une DataTable.
J'ai essayé la requête suivante
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);
Depuis le " g " représente les données groupées de la g.count retourne 1 pour les lignes qui ne dispose pas d'entrées dans le Tableau 2.J'aimerais revenir à '0' pour ces lignes.
Entrée :
Le tableau 1
Col1Val1 Col2Val1
Col1Val2 Col2Val2
Le tableau 2
Col1Val1 Col2Val1
Col1Val1 Col2Val1
Sortie De Courant :
Col1Val1 Col2Val1 2
Col2Val2 Col2Val2 1
Résultats Attendus :
Col1Val1 Col2Val1 2
Col2Val2 Col2Val2 0
J'ai regardé LINQ - Left Join Group By, et le Comte mais je ne pouvais pas appliquer le même dans ma requête ...
Pouvez-vous m'aider à résoudre cette question ?
La solution
let
il en être ainsi:
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);
Depuis je n'ai pas participer, je n'ai pas de groupe.Chaque ligne correspond à une ligne dans le tableau 1.
Voici un GroupJoin solution:
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);
Et voici une Jointure et de la solution Groupe.
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);