2010-07-08 4 views
0

J'ai Table1 et Table2 sous la forme de IEnumerable<DataRow>. Les deux tables ont des colonnes Column1 et Column2.Groupe par colonnes multiples et nombre

Je souhaite faire une jointure externe gauche sur Column1 et souhaite obtenir le nombre de lignes présentes dans Table2 et charger les enregistrements dans un 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 le g.count retourne 1 pour les lignes qui ne dispose pas des entrées dans le tableau 2. Je voudrais revenir « 0 » pour ces rangées.

entrée:

Tableau 1

Col1Val1  Col2Val1 

Col1Val2  Col2Val2 

Tableau 2

Col1Val1  Col2Val1 

Col1Val1  Col2Val1 

Courant de sortie:

Col1Val1  Col2Val1 2 

Col2Val2  Col2Val2 1 

Résultats attendus:

Col1Val1  Col2Val1 2 

Col2Val2  Col2Val2 0 

Je l'ai regardé LINQ - Left Join, Group By, and Count mais je ne pouvais pas appliquer la même dans ma requête ...

Pouvez-vous me aider à résoudre cette requête?

Répondre

2

let-il si:

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); 

Comme je ne rejoins, je ne suis pas un groupe. Chaque ligne de résultat correspond à une ligne dans Table1.


Voici une solution 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); 

Et voici une solution Inscrivez-vous et le 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); 
+0

Merci David! Votre requête fonctionne. Je suis toujours curieux de savoir s'il y a moyen de faire quelque chose de similaire à la requête SQL suivante sélectionnez a.Column1, a.Column2, Count (b.Column1) de table1 a Joindre externe table2 b sur a.Column1 = b.Column1 et a.Column2 = b.Column2 groupe Par a.Column1, a.Column2 –

+0

Ajout de plus de solutions ... il est à noter que la dernière solution donnera des résultats différents s'il y a des doublons dans le tableau1. –

+0

Merveilleux! Merci beaucoup David. –

Questions connexes