2010-11-04 17 views
24

C'è qualche differenza tra questi due modi di interrogare il contesto?Entity Framework. Dove concatenare il metodo

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId) 
      .Where(f => f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId && f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Sembra che il concatenamento sia perfettamente soddisfacente per realizzare la condizione AND. Non credo che tu possa incatenare le dichiarazioni OR. C'è un motivo per preferire uno rispetto a un altro o scenari quando uno è migliore/più efficiente?

risposta

34

Entrambi dovrebbero produrre lo stesso risultato finale (se non sbaglio) ma trovo che il secondo sia più leggibile e mostri meglio l'intento originale.


Aggiornamento

Ho appena verificato la dichiarazione di cui sopra utilizzando LINQPad. Entrambe le query produrranno lo stesso SQL.

Ad esempio:

context.SomeTable.Where(c => c.ParentId == null) 
       .Where(c => c.Name.Contains("F")) 
       .Select(c => c.Name); 

Produce:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL) 

Qual è la stessa SQL che viene prodotto da:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F")) 
       .Select(c => c.Name); 



Si potrebbe cose anche compatte un po 'più (che trovo preferibile per le stesse ragioni di cui sopra):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                && f.AnotherId == anotherId); 
+1

+1 per la leggibilità – TGnat

+0

+1 per LinqPad. – Omar

+5

Il primo è più leggibile per me. Puoi vedere immediatamente che ci sono due condizioni separate che devono coincidere e che si allineano perfettamente. Certo il secondo ha anche due condizioni, ma ci vuole il secondo in più per analizzare che c'è un && nella linea. – Ryan

0

È possibile eseguire il debug attraverso il codice e visualizzare l'SQL generato in seguito a ciascuno di essi. Immagino che si trasformi nella stessa query.

2

La mia ipotesi è che, fintanto che si sta lavorando con in IQueryable (come le vostre collezioni di contesto probabilmente sono), utilizzando le estensioni concatenate rispetto alla clausola del predicato completo si ottiene la stessa cosa. Questo perché IQueryable consente l'esecuzione posticipata, quindi in pratica viene generato lo stesso SQL dietro le quinte.

Problemi correlati