2010-07-08 42 views
0

我有表格IEnumerable<DataRow>表格1和表格2。這兩個表格都有列Column1Column2按多個列和計數組

我想在Column1上做一個左外連接,並希望得到Table2中存在的行數並將記錄加載到DataTable中。

我嘗試以下查詢

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

由於「G」代表該分組的數據的g.count爲不具有在表2中的條目我想返回行返回1「0」爲那些行。

輸入:

表1

Col1Val1  Col2Val1 

Col1Val2  Col2Val2 

表2

Col1Val1  Col2Val1 

Col1Val1  Col2Val1 

電流輸出:

Col1Val1  Col2Val1 2 

Col2Val2  Col2Val2 1 

預期結果:

Col1Val1  Col2Val1 2 

Col2Val2  Col2Val2 0 

我已經看過LINQ - Left Join, Group By, and Count但我不一樣的應用到我的查詢......

你能幫助我解決這個查詢?

回答

2

let它是這樣:

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

由於我沒有參加,我沒有進行分組。每個結果行對應於Table1中的一行。


這裏有一個解決方案羣組加入:

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

而且這裏的加入和集團的解決方案。

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

謝謝大衛!您的查詢有效。我仍然很想知道是否有辦法執行類似於以下SQL查詢的方法 從表1中選擇a.Column1,a.Column2,Count(b.Column1) a a.Column1上的左外部聯接表2b = b.Column1和a.Column2 = b.Column2 group by a.Column1,a.Column2 – 2010-07-09 15:06:06

+0

添加了更多解決方案...值得注意的是,如果Table1中存在重複項,最後的解決方案將會給出不同的結果。 – 2010-07-09 15:22:37

+0

太棒了!非常感謝David。 – 2010-07-09 15:38:06