我有 Table1 和 Table2 的形式 IEnumerable<DataRow>. 。两个表都有列 Column1Column2.

我想做一个左外连接 Column1 并希望获得其中存在的行数 Table2 并将记录加载到数据表中。

我尝试了以下查询

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 - 左连接、分组依据和计数 但我无法将相同的内容应用到我的查询中......

你能帮我解决这个问题吗?

有帮助吗?

解决方案

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

因为我没参加,所以不用组团。每个结果行对应于表 1 中的一行。


这是一个 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); 

这是一个加入和分组解决方案。

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); 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top