Saya menulis cukup banyak linq dalam kehidupan saya sehari-hari, tetapi kebanyakan pernyataan sederhana. Saya perhatikan bahwa ketika menggunakan klausa mana, ada banyak cara untuk menulisnya dan masing-masing memiliki hasil yang sama sejauh yang saya tahu. Sebagai contoh;
from x in Collection
where x.Age == 10
where x.Name == "Fido"
where x.Fat == true
select x;
Tampaknya setara dengan ini setidaknya sejauh menyangkut hasil:
from x in Collection
where x.Age == 10 &&
x.Name == "Fido" &&
x.Fat == true
select x;
Jadi, apakah memang ada perbedaan selain sintaks? Jika demikian, apa gaya yang disukai dan mengapa?
Fat
properti boolean ? Itu sangat berarti.Jawaban:
Yang kedua akan lebih efisien karena hanya memiliki satu predikat untuk mengevaluasi terhadap setiap item dalam koleksi di mana seperti yang pertama, itu menerapkan predikat pertama untuk semua item pertama dan hasilnya (yang dipersempit pada titik ini) adalah digunakan untuk predikat kedua dan seterusnya. Hasilnya semakin dipersempit setiap lintasan tetapi masih melibatkan beberapa lintasan.
Juga chaining (metode pertama) hanya akan berfungsi jika Anda DANING predikat Anda. Sesuatu seperti ini
x.Age == 10 || x.Fat == true
tidak akan bekerja dengan metode pertama Anda.sumber
EDIT: LINQ to Objects tidak berperilaku seperti yang saya harapkan. Anda mungkin tertarik dengan posting blog yang baru saya tulis tentang ini ...
Mereka berbeda dalam hal apa yang akan disebut - yang pertama setara dengan:
dimana yang terakhir setara dengan:
Sekarang, perbedaan apa yang sebenarnya terjadi tergantung pada implementasi
Where
pemanggilan. Jika penyedia berbasis SQL, saya berharap keduanya akhirnya membuat SQL yang sama. Jika ada di LINQ to Objects, yang kedua akan memiliki tingkat tipuan yang lebih sedikit (hanya akan ada dua iterator yang terlibat, bukan empat). Apakah tingkat tipuan itu penting dalam hal kecepatan adalah masalah yang berbeda.Biasanya saya akan menggunakan beberapa
where
klausa jika mereka merasa mereka mewakili kondisi yang sangat berbeda (mis. Satu harus dilakukan dengan satu bagian dari suatu objek, dan satu sama sekali terpisah) dan satuwhere
klausa ketika berbagai kondisi terkait erat (misalnya nilai tertentu lebih besar dari minimum dan kurang dari maksimum). Pada dasarnya ada baiknya mempertimbangkan keterbacaan sebelum ada sedikit perbedaan kinerja.sumber
Yang pertama akan diterapkan:
Berbeda dengan yang lebih sederhana (dan
jauh lebih cepatmungkin lebih cepat):sumber
ketika saya lari
dan
terhadap tabel Pelanggan saya menghasilkan kueri sql yang sama
jadi dalam terjemahan ke sql tidak ada perbedaan dan Anda sudah melihat di jawaban lain bagaimana mereka akan dikonversi ke ekspresi lambda
sumber
Melihat di bawah tenda, dua pernyataan akan diubah menjadi representasi kueri yang berbeda. Tergantung pada
QueryProvider
dariCollection
, ini mungkin dioptimalkan atau tidak.Ketika ini adalah panggilan linq-ke-objek, beberapa klausa akan mengarah ke rantai nomor IEnumer yang saling membaca. Menggunakan formulir satu klausa akan membantu kinerja di sini.
Ketika penyedia yang mendasarinya menerjemahkannya ke dalam pernyataan SQL, kemungkinannya bagus bahwa kedua varian akan membuat pernyataan yang sama.
sumber