มีสองประเด็น
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
เมื่อถึงการวนรอบ "ข้อมูลกระบวนการ" การสืบค้นอาจไม่ถูกต้องอีกต่อไป ตัวอย่างเช่นหากแบบสอบถามกำลังถูกเรียกใช้บน DataContext ที่ถูกจำหน่ายไปแล้วรหัสของคุณจะส่งข้อยกเว้น สิ่งนี้จะทำให้เกิดความสับสนมากเมื่อคุณกำลังประมวลผลแบบสอบถามในบริบทที่แตกต่างจากที่คุณสร้างขึ้น
ปัญหาที่สองคือการเชื่อมต่อของคุณจะไม่ถูกนำออกใช้จนกว่าการวนรอบ "ข้อมูลกระบวนการ" จะเสร็จสมบูรณ์ นี่เป็นปัญหาเฉพาะถ้า "ข้อมูลกระบวนการ" ซับซ้อน สิ่งนี้ถูกกล่าวถึงที่http://msdn.microsoft.com/en-us/library/bb386929.aspx :
ถามการเชื่อมต่อฐานข้อมูลของฉันยังคงเปิดนานเท่าไหร่
A. โดยปกติแล้วการเชื่อมต่อจะยังคงเปิดอยู่จนกว่าคุณจะใช้ผลลัพธ์แบบสอบถาม หากคุณคาดว่าจะใช้เวลาในการประมวลผลผลลัพธ์ทั้งหมดและไม่คัดค้านการแคชผลลัพธ์ให้ใช้ ToList กับแบบสอบถาม ในสถานการณ์ทั่วไปที่แต่ละวัตถุถูกประมวลผลเพียงครั้งเดียวโมเดลการสตรีมจะดีกว่าทั้ง DataReader และ LINQ ไปยัง SQL
ToList()
ดังนั้นปัญหาเหล่านี้เหตุผลที่คุณจะได้รับการสนับสนุนเพื่อให้มั่นใจว่าแบบสอบถามจะถูกดำเนินการจริงเช่นโดยการเรียก อย่างไรก็ตามตามที่Jimmy แนะนำไม่มีอะไรทำให้คุณไม่สามารถส่งคืนรายการของคุณในรูปแบบ IEnumerable ได้
ตามกฎทั่วไปฉันแนะนำให้หลีกเลี่ยงการวนซ้ำ IEnumerable มากกว่าหนึ่งครั้ง สมมติว่าผู้บริโภครหัสของคุณปฏิบัติตามกฎนี้ฉันไม่คิดว่าจะกังวลว่ามีบางคนอาจเข้าสู่ฐานข้อมูลสองครั้งด้วยการดำเนินการค้นหาสองครั้ง