2013-06-06 21 views
21

C'è una differenza significativa tra .Find(id) e .Where(x = >x.Id == id) che dovrebbe costringermi a utilizzare .Find() su .Where()/.First()?Entity Framework Find vs. Where

Immagino che .Find() sarebbe più efficiente ma è molto più efficiente che dovrei evitare .Where()/.First()?

La ragione per cui chiedo è che sto usando un FakeDbSet generico nei miei test per semplificare l'implementazione di risultati falsi e finora ho scoperto che devo ereditare quella classe e fornire un'implementazione personalizzata di .Find() mentre se scrivo il mio codice con .Where()/.First() Non ho bisogno di fare quel lavoro extra.

+1

Bene, probabilmente starai meglio confrontando 'Find' e' SingleOrDefault', poiché 'Where' restituisce le collezioni. –

+0

Vero, anche se uso sempre .First o .FirstOrDefault. –

+3

@JimmyBosse potresti prendere in considerazione l'uso di Single, per tutte le situazioni in cui dovrebbe corrispondere solo 1 record. – Kyle

risposta

31

Il punto è che find inizia cercando nella cache locale del contesto e quindi, in caso di mancata corrispondenza, invia una query al db.

where invia sempre una query al db.

Con EF 4. *, ho pensato che sql generato da find era troppo complesso e, in alcuni casi, porta a un problema di prestazioni. Quindi io uso sempre where anche con EF 5. dovrei controllare l'SQL generato da find con EF 5.

Così, alla carta, find è meglio perché usa la cache.

+9

+1. Trova anche non ha il sovraccarico di visitare un albero di espressioni, in modo che possa colpire il database più velocemente, se colpisce il database. Dove passa sempre un 'ExpressionVisitor'. – vcsjones

+0

Posso non ottenere dati errati a causa della cache? Ie Db viene aggiornato in background? – Zapnologica

+0

Sì, è possibile. È inoltre possibile che si verifichi un problema con l'accesso simultaneo all'aggiornamento di un record dopo averlo ripresentato oppure a causa del livello di isolamento o ... :) – tschmit007