实体框架/ LINQ:左连接defaultifempty失败

时间:2017-02-02 13:40:21

标签: c# entity-framework linq join

我需要在查询中加入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地址吗?

2 个答案:

答案 0 :(得分:3)

基本上,一旦您将一个表连接到一个查询中,您想要加入该表的任何其他表几乎总是也应该使用左连接。在你的情况下,你说你想要保持Table1中的行没有表4中的匹配,但是你说你只想要Table4和Table5之间的匹配,这基本上会删除所有没有&#的Table1结果39; t表4中有匹配。基本上你想要这样的东西

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

答案 1 :(得分:0)

这看起来像是问题的根源:

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

这意味着你是内部加入Table4到Table1