দুটি বিষয় আছে।
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
"প্রসেস ডেটা" লুপটি পৌঁছে যাওয়ার পরে, কোয়েরিটি আর বৈধ হয়ে উঠবে না। উদাহরণস্বরূপ, যদি কোয়েরিটি এমন ডেটা কনটেক্সটটিতে চলছে যা ইতিমধ্যে নিষ্পত্তি করা হয়েছে, তবে আপনার কোডটি একটি ব্যতিক্রম ছুঁড়ে দেবে। আপনি কোথাও এটি তৈরি করেছেন তার চেয়ে আলাদা প্রসঙ্গে যখন কোনও ক্যোয়ারী প্রক্রিয়াকরণ করছেন তখন এই জাতীয় জিনিসটি খুব বিভ্রান্ত হয়ে যায়।
একটি গৌণ সমস্যা হ'ল "প্রক্রিয়া ডেটা" লুপটি শেষ না হওয়া পর্যন্ত আপনার সংযোগটি প্রকাশ করা হবে না। "প্রক্রিয়া ডেটা" জটিল হলে এটি কেবল একটি সমস্যা। এটি http://msdn.microsoft.com/en-us/library/bb386929.aspx এ উল্লেখ করা হয়েছে :
প্র: আমার ডাটাবেস সংযোগটি আর কতক্ষণ খোলা থাকবে?
উ: আপনি ক্যোরির ফলাফলগুলি গ্রাস না করা পর্যন্ত কোনও সংযোগ সাধারণত খোলা থাকে। যদি আপনি সমস্ত ফলাফল প্রক্রিয়া করতে সময় লাগে এবং ফলাফলগুলি ক্যাশে করার বিরোধিতা না করেন তবে ক্যোয়ারিতে টোললিস্ট প্রয়োগ করুন। সাধারণ পরিস্থিতিতে যেখানে প্রতিটি অবজেক্ট কেবলমাত্র একবারে প্রক্রিয়াজাত হয় সেখানে স্ট্রিমিং মডেলটি ডেটা রিডার এবং লিনিক্যু থেকে এসকিউএল উভয় ক্ষেত্রেই উন্নত।
সুতরাং, এই ইস্যুগুলি হ'ল আপনি কেন কোয়েরিটি বাস্তবায়িত হয়েছে তা নিশ্চিত করতে উত্সাহিত করা হচ্ছে, যেমন কল করে ToList()
। যাইহোক, জিমির পরামর্শ অনুসারে আইইনুমেয়রিয়াল হিসাবে আপনার তালিকাটি ফিরিয়ে দেওয়া থেকে বিরত কিছু নেই।
একটি সাধারণ নিয়ম হিসাবে, আমি একাধিকবার আইনিউনামেবলের মাধ্যমে পুনরাবৃত্তি এড়াতে পরামর্শ দিই। আপনার কোডের গ্রাহকরা এই নিয়মটি অনুসরণ করে ধরে নিচ্ছেন, আমি এটিকে উদ্বেগ হিসাবে বিবেচনা করি না যে কেউ কেউ কোয়েরি দু'বার করে সম্পাদন করে দুবার ডাটাবেসে আঘাত করতে পারে।