Saya akan menganggap ini sebagai tempat yang tepat untuk menggunakan pemisahan perintah / permintaan . Sebagai contoh:
// query
var validItems = items.Where(i => i.Field != null && i.State != ItemStates.Deleted);
// command
foreach (var item in validItems) {
// do stuff
}
Ini juga memungkinkan Anda untuk memberikan nama yang mendokumentasikan diri sendiri dengan baik ke hasil kueri. Ini juga membantu Anda melihat peluang untuk refactoring, karena jauh lebih mudah untuk melakukan refactor kode yang hanya menanyakan data atau hanya mengubah data daripada kode campuran yang mencoba melakukan keduanya.
Saat men-debug, Anda dapat memutuskan sebelum foreach
dengan cepat memeriksa apakah isi dari validItems
penyelesaian sesuai dengan yang Anda harapkan. Anda tidak harus masuk ke lambda kecuali Anda perlu. Jika Anda perlu masuk ke dalam lambda, maka saya sarankan untuk memfaktorkannya ke dalam fungsi yang terpisah, kemudian melangkah melalui itu.
Apakah ada perbedaan kinerja? Jika kueri didukung oleh database, maka versi LINQ memiliki potensi untuk berjalan lebih cepat, karena kueri SQL mungkin lebih efisien. Jika itu LINQ untuk Objek, maka Anda tidak akan melihat perbedaan kinerja nyata. Seperti biasa, buat profil kode Anda dan perbaiki kemacetan yang sebenarnya dilaporkan, alih-alih mencoba memprediksi optimisasi sebelumnya.