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项

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

首先,您需要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()
    };

编辑

如果您想添加额外的谓词,则将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
    };