我正在尝试实现一个有点棘手的Linq查询。
数据库结构:
表A:IDA,名称A
表B:idB,idA,nameB
表C:IDC,IDA,名称C
表D:idD,idB,idC,nameD
(idB和idC都可以为空)
所有字段均为必填项。
Structure Schema
预期:
我想检索:
A项目清单(不同)
前10个D项(来自B或C)
谓词应用于找到的D项
最佳答案
首先,您需要使用LEFT JOIN
和tableD
来tableB
tableC
。
var augmentedD =
from d in tableD
join b in tableB on d.IdB equals b.IdB into bs
join c in tableC on d.IdC equals c.IdC into cs
from b in bs.DefaultIfEmpty()
from c in cs.DefaultIfEmpty()
let idAA = b != null ? b.IdA : c != null ? c.IdA : (int?) null
where idAA != null
let idA = idAA.Value
select new
{
idA,
d
};
然后,
GroupJoin
tableA
到该结果。var nestedA = from a in tableA
join d in augmentedD on a.IdA equals d.idA into g
select
new
{
A = a,
D = g.OrderBy(x => x.d.NameD)
.Take(10)
.Select(x => x.d)
.ToList()
};
编辑
如果要添加其他谓词,请在
Where
之后放置tableD
语句var augmentedD =
from d in tableD.Where(predicate)
join b in tableB on d.IdB equals b.IdB into bs
join c in tableC on d.IdC equals c.IdC into cs
from b in bs.DefaultIfEmpty()
from c in cs.DefaultIfEmpty()
let idAA = b != null ? b.IdA : c != null ? c.IdA : (int?) null
where idAA != null
let idA = idAA.Value
select new
{
idA,
d
};
关于c# - Linq to Sql-查询具有多个联接的不同项目的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40327573/