为什么EF在查询引用属性时生成此sql

为什么EF在查询引用属性时生成此sql,sql,entity-framework,entity-framework-4,Sql,Entity Framework,Entity Framework 4,使用AdventureWorks数据库并发出此查询时: AdventureWorksEntities entities = new AdventureWorksEntities(); entities.Contacts.Where(x => x.FirstName == "A" || x.FirstName == "B" || x.FirstName

使用AdventureWorks数据库并发出此查询时:

   AdventureWorksEntities entities = new AdventureWorksEntities();
   entities.Contacts.Where(x => x.FirstName == "A" 
                               || x.FirstName == "B" 
                               || x.FirstName == "C")
                     .ToList();
entities.Employee.Where(x => x.Contact.FirstName == "A" 
                             || x.Contact.FirstName == "B" 
                             || x.Contact.FirstName == "C")
                .ToList();
将被转换为此sql,这是它所能做到的最好的:

//ommited for brevity
FROM [Person].[Contact] AS [Extent1]
WHERE [Extent1].[FirstName] IN (N'A',N'B',N'C')
但是,当我发出此查询时:

   AdventureWorksEntities entities = new AdventureWorksEntities();
   entities.Contacts.Where(x => x.FirstName == "A" 
                               || x.FirstName == "B" 
                               || x.FirstName == "C")
                     .ToList();
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会在它们之间拆分where

注意:使用contains创建相同的SQL:

var names = new List<string>{"A", "B", "C"};
entities.Employee.Where(x => names.Contains(x.Contact.FirstName)).ToList();
var name=新列表{“A”、“B”、“C”};
entities.Employee.Where(x=>names.Contains(x.Contact.FirstName)).ToList();
编辑:所以这似乎是一个EF错误,我已经接受了答案,这提供了一个解决办法


编辑:打开连接问题,它位于

看起来像EF中的错误

我认为问题与检查子表中的字段有关。EF没有看到所有OR子句都引用同一个表和该表中的同一字段。因此,它创建了复杂的连接

尝试重写它以使用CONTAINS而不是OR


编写一个存储过程,该过程接受TVP作为输入参数,并让EF具体化来自SP的结果:)

Contains具有相同的行为。