2013-03-21 8 views
5

Dovrei preoccuparmi per l'ordine delle clausole di query linq di Entity Framework in termini di prestazioni?L'ordine delle clausole della query linq EF influenza le prestazioni?

Nell'esempio seguente è possibile modificare l'ordine delle due clausole where hanno un impatto sulle prestazioni nella ricerca DB?

 using (var context = new ModelContext()) 
     { 
      var fetchedImages = (from images in context.Images.Include("ImageSource") 
           where images.Type.Equals("jpg") 
           where images.ImageSource.Id == 5 
           select images).ToArray(); 
     } 
+1

Controllare il codice SQL generato sia con Dove e una sola condizione con '&&', se sono gli stessi, allora non ci dovrebbe essere alcuna differenza – Habib

risposta

4

No, la modifica di queste due clausole where non influisce sulle prestazioni. Generated SQL sarà simile a questa in ogni caso:

WHERE [condition1] AND [condition2] 

Inoltre, è possibile scrivere le condizioni, in combinazione con gli operatori logici:

where images.Type.Equals("jpg") && images.ImageSource.Id == 5 
+0

Questo è solo se si ignora corto circuito: se '[condizione2]' è falso più spesso di '[condition1]', potresti vedere un guadagno in termini di prestazioni scambiando l'ordine. – RoadieRich

+0

@RoadieRich: anche se in teoria hai ragione, credi davvero, che potresti ** vedere ** qualsiasi differenza, quando si scambiano queste due condizioni? :) – Dennis

+0

Dato un set di dati appropriatamente grande, sì si potrebbe. – RoadieRich

-1

Il caso generale è che le where operatori sarà "corto circuito", così se il primo è falso, il secondo non verrà nemmeno esaminato, quindi se uno fallirà più frequentemente, generalmente lo si vuole controllare prima.

Tuttavia, ciò si interrompe se l'errore più frequente è lento da elaborare.

L'unico modo per dirlo è profilare il codice utilizzando gli strumenti appropriati.

+0

Mentre è vero per LINQ-to-Objects, afferma espressamente "ha un impatto sulle prestazioni nella ricerca DB" dove questa risposta non si applica. Una volta che viene tradotto in SQL, il provider db deciderà cosa fare con esso (come ha affermato Gert Arnold nell'altra risposta). – Ocelot20