İki sorun var.
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
"İşlem Verileri" döngüsüne ulaşıldığında, sorgu artık geçerli olmayabilir. Örneğin, sorgu zaten Atılmış bir DataContext'te çalışıyorsa, kodunuz bir istisna atar. Bu tür bir şey, bir sorguyu yarattığınız yerden farklı bir bağlamda işlerken kafa karıştırıcı hale gelir.
İkincil bir sorun, "İşlem Verileri" döngüsü tamamlanıncaya kadar bağlantınızın serbest bırakılmamasıdır. Bu, yalnızca "İşlem Verileri" karmaşıksa bir sorundur. Bu, http://msdn.microsoft.com/en-us/library/bb386929.aspx adresinde belirtilmiştir :
S. Veritabanı bağlantım ne kadar süre açık kalacak?
A., sorgu sonuçlarını tüketene kadar bir bağlantı genellikle açık kalır. Tüm sonuçları işlemek için zaman ayırmayı planlıyorsanız ve sonuçları önbelleğe almak istemiyorsanız, sorguyu ToList'e uygulayın. Her nesnenin yalnızca bir kez işlendiği genel senaryolarda, akış modeli, DataReader ve LINQ to SQL'de üstündür.
Bu nedenle, bu sorunlar, sorgunun gerçekten yürütülmesini sağlamak için teşvik edilmenizin nedenidir, örneğin arayarak ToList()
. Ancak, Jimmy Suggest'in dediği gibi, Listenizi bir IEnumerable olarak geri döndürmekten alıkoyacak bir şey yok.
Genel bir kural olarak, bir IEnumerable üzerinde birden fazla kez yinelemekten kaçınılmasını öneririm. Kodunuzun tüketicilerinin bu kurala uyduğunu varsayarsak, sorguyu iki kez uygulayarak birisinin veritabanına iki kez vurabileceği endişesini düşünmüyorum.