Entity Framework左连接多表失败

Entity Framework left join multiple tables failure

我使用的是 Entity Framework 6,我有几个实体和如下查询:

var results = (from e1 in dataContext.Entity1
                   .Where(x => x.Key1 == 1)
               from e2 in dataContext.Entity2
                   .Where(x => x.Key2 == e1.Key1)
                   .DefaultIfEmpty()
               from e3 in dataContext.Entity3
                   .Where(x => x.Key3 == e1.Key1 || x.Key3 == e2.Key2)
                   .DefaultIfEmpty()
               select new 
               {
                   E1 = e1,
                   E2 = e2,
                   E3 = e3
               }).ToList();

由于与 Entity2 和 Entity3 的连接是左连接,因此 e2 或 e3 可能为空。我发现如果 e2 为 null,则会抛出异常 System.Reflection.TargetException 并显示消息 "Non-static method requires a target"。如果我按如下方式将连接更改为 Entity3,我仍然会遇到同样的错误。

from e3 in dataContext.Entity3
               .Where(x => x.Key3 == e1.Key1 
                      || (e2 != null && x.Key3 == e2.Key2))
               .DefaultIfEmpty()

如何更改查询?

@Steve Li

对于你来说,回答你的问题: 如第二条评论所述,请阅读 C# Linq 关于 join-clause 的 MSDN 参考。您应该尽量避免 Left Outer Join - 使用 DefaultIfEmpty 函数。

要使您的代码正常工作,请尝试以下操作:

var result =    from e1 in entities1
                join e2 in entities2 on e1.Key1 equals e2.Key2
                join e3 in entities3 on e1.Key1 equals e3.Key3
                where e1.Key1 == 1
                select new
                {
                    E1 = e1,
                    E2 = e2,
                    E3 = e3
                };

这将使您的三个实体合并 table。此处的代码 (dotnetfiddle.net/dQuXbP) 将让您体验结果的样子。

谢谢大家的建议。终于找到问题了

为了简化问题,我没有告诉 Entity1 实际上是存储过程中的 return。我认为它与 table 相同,因为存储过程 return 是 table 中的全部记录。事实证明有人将 Entity Framework 的存储过程包装器更改为 return Entity1 列表。在我将它改回原来由 EF 生成的代码后,它工作正常。