题
我有 Table1 和 Table2 的形式 IEnumerable<DataRow>
. 。两个表都有列 Column1
和 Column2
.
我想做一个左外连接 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);
不隶属于 StackOverflow