Ada dua masalah.
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
Saat loop "Data Proses" tercapai, kueri mungkin tidak lagi valid. Misalnya, jika kueri dijalankan pada DataContext yang sudah dibuang, kode Anda akan mengeluarkan pengecualian. Hal semacam ini menjadi sangat membingungkan ketika Anda memproses kueri dalam konteks yang berbeda dari tempat Anda membuatnya.
Masalah kedua adalah bahwa koneksi Anda tidak akan dirilis sampai loop "Data Proses" selesai. Ini hanya masalah jika "Data Proses" kompleks. Ini disebutkan di http://msdn.microsoft.com/en-us/library/bb386929.aspx :
Q. Berapa lama koneksi database saya tetap terbuka?
A. Koneksi biasanya tetap terbuka sampai Anda mengonsumsi hasil kueri. Jika Anda berharap untuk mengambil waktu untuk memproses semua hasil dan tidak menentang caching hasil, terapkan ToList ke kueri. Dalam skenario umum di mana setiap objek diproses hanya satu kali, model streaming lebih unggul di DataReader dan LINQ ke SQL.
Jadi, masalah ini adalah alasan mengapa Anda didorong untuk memastikan bahwa kueri benar-benar dieksekusi, misalnya dengan menelepon ToList()
. Namun, seperti yang disarankan oleh Jimmy, tidak ada yang menghentikan Anda mengembalikan Daftar sebagai IEnumerable.
Sebagai aturan umum, saya sarankan menghindari iterasi lebih dari satu IEnumerable lebih dari sekali. Dengan asumsi konsumen kode Anda mengikuti aturan ini, saya tidak menganggapnya sebagai kekhawatiran bahwa seseorang mungkin menekan database dua kali dengan mengeksekusi kueri dua kali.