sql - 使用 LINQ to Entities 编写嵌套联接

标签 sql entity-framework linq azure c#-6.0

我很确定这里有一个这样的例子,我只是找不到它,因为我不知道确切的术语。所以请善意一点。

问题应该很简单:

我有一个 Azure SQL 数据库,设计有些糟糕(即缺少外键等)。由于我目前无法重新设计数据库,因此我必须通过查询手动处理关系。由于数据库也是我们软件的瓶颈,因此我必须尝试以尽可能少的数据库命中来完成查询。

我有实体 A、B、C 和 D。实体 A 有多个实体 B(通过未注册的外键连接),实体 B 有多个实体 C,实体 C 有多个实体 D。

我有实体 A 的 ID,并且希望尽可能最佳地返回直到 D 的所有连接实体的树。

开始:

from A in dbA.Where(e=>e.Id==IDParameter)
join B in dbB on A.Id equals B.AId into Bs

现在我需要对 C 的 Bs 中的每个 B 进行此操作,然后再对 D 的 Cs 进行此操作。如果我采用显而易见的方式,首先加入 Ds 和 Cs,然后加入 Bs 和 Cs,最后加入 As 和Bs,这意味着将所有 D 与 C 结合起来,然后所有...您明白了,直到我最终到达 IDParameter 过滤器。只是看起来没有效果。

是否有正确的 C# 方法可以在单个查询中执行此操作?

最佳答案

当您定义了关系时,您可以使用手动联接来模拟 EF 的操作。您所需要的就是使用Group Join和预测。像这样的事情:

var result =
    (from a in db.A
     where a.Id == IDParameter
     join b in db.B on a.Id equals b.AId into Bs
     select new
     {
         a,
         Bs =
            (from b in Bs
             join c in db.C on b.Id equals c.BId into Cs
             select new
             {
                 b,
                 Cs =
                    (from c in Cs
                     join d in db.D on c.Id equals d.CId into Ds
                     select new
                     {
                         c,
                         Ds = Ds.ToList()
                     }).ToList() 
             }).ToList()
     }).ToList();

关于sql - 使用 LINQ to Entities 编写嵌套联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095064/

相关文章:

java - mysql 和 java

wcf - 我可以在 Entity Framework 4.3 中使用 RIA 服务吗?

.net - EdmAssociationConstraint : : The number of properties in the Dependent and Principal Roles in a relationship constraint

c# - 在 c# 中比较 2 List<Dictionary<string,object>>

xml - LINQ to XML 查询属性

c# - 如何知道是否有一轮是由 parent 引起的(A=>B=>C=>A)

php - 在 MYSQL 中创建表时,在为 unicode 声明 Varchar 时感到困惑吗?

mysql - 连接两个缩进选择查询以获得不同列中的不同行

mysql - 返回表中未使用的所有日期的 SQL 查询

c# - 在 EF WCF 服务中使用上下文和存储库