实体框架左连接多表失败

本文关键字:失败 连接 框架 实体 | 更新日期: 2023-09-27 18:05:01

我正在使用实体框架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是空的,异常System.Reflection.TargetException抛出消息"非静态方法需要一个目标"。如果我将连接更改为Entity3,如下所示,我仍然得到相同的错误。

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

如何更改查询?

实体框架左连接多表失败

谢谢大家的建议。我终于解决了这个问题。

为了简化问题,我没有说明Entity1实际上是存储过程的返回值。我认为它与表相同,因为存储过程从表返回整个记录。原来是有人更改了存储过程的实体框架包装器以返回Entity1列表。在我将它更改回原来从EF生成的代码后,它工作得很好。

@Steve Li

给你,回答你的问题:正如前面提到的第二条注释,请阅读c# Linq的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)将让您体验一下结果的样子。