我正在尝试实现一个有点棘手的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 JOINtableDtableB 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/

10-12 14:03