Domanda

Ho Table1 e Table2 sotto forma di IEnumerable<DataRow>. Entrambe le tabelle hanno colonne Column1 e Column2.

Vorrei fare un join esterno sinistro su Column1 e vorrei ottenere un conteggio delle righe presenti in Table2 e caricare i record in un DataTable.

Ho provato la seguente query

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

Poiché il 'g' rappresenta i dati raggruppati, il G.Count restituisce 1 per le righe che non hanno voci nella Tabella 2. Vorrei restituire '0' per quelle righe.

Ingresso:

Tabella 1

Col1Val1       Col2Val1

Col1Val2       Col2Val2
.

Tabella 2

Col1Val1       Col2Val1

Col1Val1       Col2Val1
.

Uscita corrente:

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    1
.

Risultati previsti:

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    0
.

Ho guardato linq - Iscriviti a sinistra, Gruppo di e conteggio < / a> Ma non potrei applicare lo stesso nella mia query ...

Puoi aiutarmi a risolvere questa query?

È stato utile?

Soluzione

let E 'SO:

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

Dato che non mi è unito, non devo raggruppare.Ogni riga di risultato corrisponde a una riga in Tabella1.


.

Ecco una soluzione 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); 
.

ed ecco una soluzione di join e gruppo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top