首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq to Sql -具有多个联接的不同项的查询列表

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

Stack Overflow用户
提问于 2016-10-30 09:14:29
回答 1查看 115关注 0票数 2

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

DB结构:

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

所有字段都是强制性的。

结构图式

预期:

我想要找回:

  • A项(不同) 的列表
    • 具有10个第一个D项(来自B或C)
      • 在找到的D项上应用谓词

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-30 12:13:31

首先,您需要使用LEFT JOIN tableDtableBtableC

代码语言:javascript
复制
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给出了这个结果。

代码语言:javascript
复制
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之后

代码语言:javascript
复制
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
    };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40327573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档