gpt4 book ai didi

c# - Linq to Sql - 具有多个连接的不同项目的查询列表

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:58 24 4
gpt4 key购买 nike

我正在尝试实现一个有点棘手的 Linq 查询。

数据库结构:

  • 表A:idA,nameA
  • 表 B:idB、idA、nameB
  • 表 C:idC、idA、nameC
  • 表 D:idD、idB、idC、nameD
    • (idB 和 idC 都可以为空)

所有字段都是必填的。

Structure Schema

预期:

我想检索:

  • A 项列表(不同的)
    • 前 10 个 D 项(来自 B 或 C)
      • 对找到的 D 项应用谓词

最佳答案

首先,您需要LEFT JOIN tableDtableBtableC

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

编辑

如果你想添加额外的谓词,那么在tableD之后添加Where语句

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com