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

时间:2016-10-30 09:14:30

标签: c# sql linq entity

我试图实现一个有点棘手的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 OR C)
      • 在已找到的D项目上应用了谓词

1 个答案:

答案 0 :(得分:0)

首先,您需要使用LEFT JOINtableD 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
    };