【问题标题】:Entity Framework / LINQ: Left join defaultifempty fails实体框架/LINQ:左连接 defaultifempty 失败
【发布时间】:2017-02-02 13:40:20
【问题描述】:

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

正因为如此,我正在尝试像这样对LEFT JOINTable4Table5 做一个:

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 的问题?

【问题讨论】:

标签: c# entity-framework linq join


【解决方案1】:

基本上,一旦您将一个表连接到查询中,您想要连接到该表的任何其他表几乎都应该使用左连接来完成。在您的情况下,您是说您希望在 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()

【讨论】:

  • 谢谢你先生帮助一个菜鸟!
【解决方案2】:

这似乎是您的问题的根源:

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

这意味着您将 Table4 内部连接到 Table1

【讨论】:

  • 其实是组加入,下面DefaultIfEmpty会导致左加入。问题在于以下从 Table4 到 Table5 的内部连接,它基本上撤消了之前的左连接。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多