实体框架左连接多个表失败

时间:2016-09-01 07:47:42

标签: c# entity-framework-6 left-join

我正在使用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异常,并显示消息“非静态方法需要目标”。如果我将连接更改为Entity3,则仍然会出现同样的错误。

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

如何更改查询?

2 个答案:

答案 0 :(得分:2)

谢谢你的所有建议。最后我发现了问题。

为了简化问题,我没有告诉Entity1实际上是从存储过程返回的。我认为它与表相同,因为存储过程从表中返回整个记录。事实证明,有人更改了Entity Framework的存储过程包装器以返回Entity1列表。在我将其更改回EF中最初生成的代码后,它可以正常工作。

答案 1 :(得分:0)

@Steve Li

为了你,提出你的问题: 与上面提到的第二条评论一样,请阅读C#Linq关于 join-clause 的MSDN参考。您应该尝试使用 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
                };

这将为您提供三个实体的联合表。这里的代码(dotnetfiddle.net/dQuXbP)将让您体验结果的样子。