c# - Entity Framework /LINQ : Left join defaultifempty fails

标签 c# entity-framework linq join

我需要在查询中连接 5 个表。其中 3 个表必须具有关系,但其中两个可以选择连接到一个条目。

因此,我尝试对 Table4Table5 进行 LEFT JOIN,如下所示:

var cDesc = (cDesc == null ? "" : cDesc);
var cStreet = (cStreet == null ? "" : cStreet);

var q = await (from t1 in MyContext.Table1

           join t2 in MyContext.Table2
           on t1.ID equals t2.ObjectID

           join t3 in MyContext.Table3
           on t2.TeamID equals t3.TeamID

           join t4 in MyContext.Table4
           on t1.ID equals t4.ObjectID
           into join3

           from j3 in join3.DefaultIfEmpty()
           join t5 in MyContext.Table5
           on j3.StorageID equals t5.StorageID

           where t2.ObjectType.Equals(16)
           && t3.UserID.Equals(userID)
           && t1.Description.Contains(cDesc)
           && l.Address.Contains(cStreet)

           orderby t1.ID descending

           select new Table1ListModel
           {
               ID = t1.ID,
               Description = t1.Description,
               Address = t5.Address
           }

           )
           .Take(takeThis)
           .ToListAsync();

但是这个查询仅适用于与Table4有连接的行,所以我显然做错了。

我的连接正确吗?或者问题是我想在来自第五个表的地址上运行where

最佳答案

基本上,一旦您将一个表左连接到查询中,您想要连接到该表的任何其他表几乎都应该使用左连接来完成。在您的情况下,您说您希望保留 Table1 中与 Table4 中不匹配的行,但是您又说您只想在 Table4 和 Table5 之间进行匹配,这基本上会删除所有没有匹配的 Table1 结果见表4。基本上你想要这样的东西

from j3 in join3.DefaultIfEmpty()
join temp5 in MyContext.Table5
    on j3.StorageID equals temp5.StorageID into join4
from t5 in join4.DefaultIfEmpty()

关于c# - Entity Framework /LINQ : Left join defaultifempty fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003736/

相关文章:

c# - 起订量返回设置在第二次执行时返回错误数据

c# - 如何禁用系统设备?

c# - MVC - Entity Framework - 这属于哪里?

.net - 访问 DbSet 时的 Effort (EF6) 异常(字​​典中不存在给定的键)

C# 查询并比较 CSV 文件中的条目

c# - 在 foreach 循环中删除一个节点

c# - 如何更直观地设计 WPF 事物,a-la WinForms?

php - ORM for PHP like .NET Entity Framework

linq - 查找所有元素共有的值

c# - Linq to XML 拉回存在于不同级别的属性