【发布时间】:2011-06-17 06:56:06
【问题描述】:
使用 AdventureWorks 数据库并发出此查询时:
AdventureWorksEntities entities = new AdventureWorksEntities();
entities.Contacts.Where(x => x.FirstName == "A"
|| x.FirstName == "B"
|| x.FirstName == "C")
.ToList();
会被翻译成这个sql,这是能做到的最好的:
//ommited for brevity
FROM [Person].[Contact] AS [Extent1]
WHERE [Extent1].[FirstName] IN (N'A',N'B',N'C')
但是当我发出这个查询时:
entities.Employee.Where(x => x.Contact.FirstName == "A"
|| x.Contact.FirstName == "B"
|| x.Contact.FirstName == "C")
.ToList();
我得到了这个 SQL:
//ommited for brevity
FROM [HumanResources].[Employee] AS [Extent1]
INNER JOIN [Person].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID]
LEFT OUTER JOIN [Person].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID]
WHERE [Extent2].[FirstName] = N'A' OR [Extent3].[FirstName] IN (N'B',N'C')
为什么我得到一个内连接和外连接,而 EF 将它们的位置分开?
注意使用 contains 创建相同的 SQL:
var names = new List<string>{"A", "B", "C"};
entities.Employee.Where(x => names.Contains(x.Contact.FirstName)).ToList();
编辑:所以它似乎是一个 EF 错误,我已经接受了提供解决方法的答案
编辑:打开连接问题,它位于here
【问题讨论】:
标签: sql entity-framework entity-framework-4