2011-01-28 8 views
8

Quando si utilizza il database AdventureWorks e il rilascio questa query:Perché EF generare questo SQL per le query di proprietà di riferimento

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

sarà tradotto a questo SQL, che è il meglio che può:

Tuttavia quando ho emettere questo query:

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

ottengo questo 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') 

Perché sto ottenendo un join interno ed esterno ed è EF che divide il punto in cui si trovano entrambi?

di nota utilizzando contiene crea lo stesso SQL:

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

EDIT: Così sembra essere un bug EF, ho accettato la risposta che ha fornito un lavoro in giro

EDIT: Inaugurato il collegamento problema, si trova here

risposta

1

Scrivi una stored procedure che accetta un TVP come parametro di input e lasciare EF materializzano i risultati dalla SP :)

+0

Bel lavoro intorno :) – BennyM

0

Sembra un bug in EF.

Penso che i problemi siano legati al controllo di un campo in un sottotabella. EF non vede che tutte le clausole OR si riferiscono alla stessa tabella e allo stesso campo in quella tabella. Pertanto, crea quel join complicato.

Provare a riscriverlo per utilizzare CONTAINS anziché OR.

Using contains() in LINQ to SQL

+0

Contiene ha lo stesso comportamento. – BennyM

Problemi correlati