Considererei questo come un luogo appropriato per utilizzare comando / separazione delle query . Ad esempio:
// query
var validItems = items.Where(i => i.Field != null && i.State != ItemStates.Deleted);
// command
foreach (var item in validItems) {
// do stuff
}
Ciò consente anche di dare un buon nome autodocumentante al risultato della query. Ti aiuta anche a vedere le opportunità per il refactoring, perché è molto più semplice il codice refactor che interroga solo i dati o muta solo i dati rispetto al codice misto che tenta di eseguire entrambi.
Quando esegui il debug, puoi interrompere prima di foreach
per verificare rapidamente se il contenuto di validItems
si risolve in ciò che ti aspetti. Non è necessario entrare nel lambda a meno che non sia necessario. Se hai bisogno di entrare nel lambda, allora ti suggerisco di includerlo in una funzione separata, quindi scorri quella.
C'è una differenza nelle prestazioni? Se la query è supportata da un database, la versione LINQ ha il potenziale per essere eseguito più rapidamente, perché la query SQL potrebbe essere più efficiente. Se si tratta di LINQ to Objects, non si vedranno differenze di prestazioni reali. Come sempre, profila il tuo codice e correggi i colli di bottiglia effettivamente riportati, piuttosto che cercare di prevedere in anticipo le ottimizzazioni.