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

Ben*_*nyM 8 sql entity-framework entity-framework-4

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

   AdventureWorksEntities entities = new AdventureWorksEntities();
   entities.Contacts.Where(x => x.FirstName == "A" 
                               || x.FirstName == "B" 
                               || x.FirstName == "C")
                     .ToList();
Run Code Online (Sandbox Code Playgroud)

将被翻译成这个sql,它是最好的:

//ommited for brevity
FROM [Person].[Contact] AS [Extent1]
WHERE [Extent1].[FirstName] IN (N'A',N'B',N'C')
Run Code Online (Sandbox Code Playgroud)

但是,当我发出此查询时:

entities.Employee.Where(x => x.Contact.FirstName == "A" 
                             || x.Contact.FirstName == "B" 
                             || x.Contact.FirstName == "C")
                .ToList();
Run Code Online (Sandbox Code Playgroud)

我得到这个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')
Run Code Online (Sandbox Code Playgroud)

为什么我会得到一个内部和外部联接,并且EF将两者分开?

注意使用包含创建相同的SQL:

var names = new List<string>{"A", "B", "C"};
entities.Employee.Where(x => names.Contains(x.Contact.FirstName)).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑:所以它似乎是一个EF错误,我接受了提供解决方案的答案

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

Tim*_*ahy 1

编写一个存储过程,它接受 TVP 作为输入参数,并让 EF 实现 SP 的结果:)