2011-01-28 3 views
8

przypadku korzystania z bazy danych AdventureWorks i wydawania tej kwerendy:Dlaczego EF wygenerowania tego sql podczas odpytywania właściwość odniesienia

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

będą tłumaczone na tym SQL, który jest najlepszy to może:

jednak kiedy wydaj zapytanie:

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

otrzymuję ten 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') 

Dlaczego otrzymuję sprzężenie wewnętrzne i zewnętrzne, a EF dzieli je na oba?

nuty używając zawiera tworzy ten sam SQL:

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

EDIT: A więc wydaje się być błąd EF, jakie przyjął odpowiedź, która dostarczyła obejść

EDIT: Otwarty połączyć wydanie, znajduje się here

Odpowiedz

1

Napisz procedury przechowywanej, która akceptuje TVP jako parametr wejściowy i niech EF zmaterializować wyniki z SP :)

+0

Dobra robota :) – BennyM

0

Wygląda jak błąd w EF.

Myślę, że problemy są związane z sprawdzaniem w odniesieniu do pola w tabeli podrzędnej. EF nie widzi, że wszystkie klauzule OR odnoszą się do tej samej tabeli i tego samego pola w tej tabeli. Dlatego tworzy to skomplikowane sprzężenie.

Spróbuj przepisać, aby użyć ZAWIERA zamiast LUB.

Using contains() in LINQ to SQL

+0

Zawiera ma takie samo zachowanie. – BennyM