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 ?

Était-ce utile?

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); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top