实体框架左连接多表失败
本文关键字:失败 连接 框架 实体 | 更新日期: 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)将让您体验一下结果的样子。