2016-06-14 13 views
8

Mi chiedo, se utilizzo più metodi Where(...) uno dopo l'altro, EntityFramework sia abbastanza intelligente da combinarlo in una query risultante. Diciamo che ho:EntityFramework Multiple Where

context.Items 
    .Where(item => item.Number > 0) 
    .Where(item => item.Number < 5) 
    .ToList(); 

disposta la query SQL risultante essere lo stesso come se scrivo:

context.Items 
    .Where(item => item.Number > 0 && item.Number < 5) 
    .ToList(); 

c'è alcuna ottimizzazione dietro le scene sono per molteplici clausola Where?

+0

Dovrebbero entrambi tradurre allo stesso SQL per qualsiasi grande provider. Puoi sempre provare entrambi e vedere che cosa produce ogni SQL. –

+1

Sì multiplo dove è lo stesso di unire le condizioni con && (che si sarebbe potuto verificare in circa un minuto). – Evk

+0

@Evk Non è stato possibile verificare velocemente eventuali ottimizzazioni dello zucchero JIT o della sintassi, senza tuttavia scavare nei documenti e nell'IL. Si prega di vedere la mia ultima domanda. Grazie. – Andrei

risposta

5

Sì, ci sono. Non è Entity Framework che fa questo. In realtà è il lavoro di SQL Provider Factory a comporre la query per il database. A seconda del database che si utilizza, questo codice proviene da diverse fonti.

Per MSSQL, il codice è di Microsoft ed è nella libreria System.Data.SqlClient. Se guardi il tuo elemento di connessione nel tuo web.config, dovresti notare l'attributo "providerName".

All'interno di questa libreria o di librerie simili ad esso, spesso viene utilizzato un modello di visitatore ricorsivo per navigare attraverso il grafico dell'oggetto Albero espressione definito, al fine di produrre la query più efficiente possibile.

L'utilizzo di più clausole where è molto facile da rilevare e ottimizzare, il posto in cui queste librerie hanno problemi tende ad essere con proiezioni profondamente annidate.

si può vedere la SQL prodotta dalla query se si utilizza

context.Items 
.Where(item => item.Number > 0) 
.Where(item => item.Number < 5) 
.ToString(); 
+0

Grazie per la tua risposta! – Andrei

Problemi correlati