Linq to Sql -查询具有多个连接的不同项的列表
本文关键字:连接 列表 Sql to 查询 Linq | 更新日期: 2023-09-27 18:15:36
我正在尝试实现一个有点棘手的Linq查询。
数据库结构:
- 表A: idA, nameA
- 表B: idB, idA, nameB
- 表C: idC, idA, nameC
- 表D: idD, idB, idC, nameD
- (idB和idC均可为空)
所有字段为必填。
结构模式:
我要检索:
- a项列表(不同)
- 前10个D项(来自B或C)
- 与谓词应用于找到的D项
- 前10个D项(来自B或C)
首先,您需要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
};