2011-01-28 21 views
8

tham khảo Khi sử dụng cơ sở dữ liệu AdventureWorks và phát hành truy vấn này:Tại sao EF tạo sql này khi truy vấn bất động sản

AdventureWorksEntities entities = new AdventureWorksEntities(); 
    entities.Contacts.Where(x => x.FirstName == "A" 
           || x.FirstName == "B" 
           || x.FirstName == "C") 
        .ToList(); 

sẽ được dịch sang sql này, đó là tốt nhất có thể:

Tuy nhiên, khi tôi đưa ra truy vấn này:

entities.Employee.Where(x => x.Contact.FirstName == "A" 
          || x.Contact.FirstName == "B" 
          || x.Contact.FirstName == "C") 
       .ToList(); 

Tôi nhận được SQL này:

//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') 

Tại sao tôi nhận được sự tham gia bên trong và bên ngoài và EF tách vị trí của cả hai?

Trong Lưu ý sử dụng chứa tạo ra SQL giống nhau:

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

EDIT: Vì vậy, nó dường như là một lỗi EF, tôi đã chấp nhận câu trả lời mà cung cấp một công việc xung quanh

EDIT: Khai trương kết nối vấn đề, nó nằm ở here

Trả lời

1

Viết Stored Procedure mà chấp nhận một TVP như tham số đầu vào và để cho EF hóa các kết quả từ các SP :)

+0

Làm việc tốt xung quanh :) – BennyM

0

Trông giống như một lỗi trong EF.

Tôi nghĩ rằng các sự cố liên quan đến việc bạn kiểm tra một trường trong bảng phụ. EF không thấy rằng tất cả các mệnh đề OR đều tham chiếu đến cùng một bảng và cùng một trường trong bảng đó. Do đó, nó tạo ra sự tham gia phức tạp đó.

Hãy thử viết lại nó để sử dụng CONTAINS thay vì OR.

Using contains() in LINQ to SQL

+0

Có có hành vi tương tự. – BennyM

Các vấn đề liên quan