我正在使用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()
如何更改查询?
答案 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)将让您体验结果的样子。