এই ক্ষেত্রে IQueryable<T>
এবং এর মধ্যে পার্থক্য করা গুরুত্বপূর্ণ IEnumerable<T>
। সংক্ষেপেIQueryable<T>
একটি লিনকিউ সরবরাহকারী একটি অপ্টিমাইজড ক্যোয়ারী সরবরাহ করার জন্য প্রক্রিয়া করে। এই রূপান্তরকালে সমস্ত সি # স্টেটমেন্ট সমর্থিত হয় না, কারণ এটি হয় কোনও ব্যাক-এন্ড নির্দিষ্ট সন্ধানের (যেমন এসকিউএল) তে অনুবাদ করা সম্ভব নয় বা প্রয়োগকারীরা বিবৃতিটির প্রয়োজনীয়তার পূর্বেই প্রত্যাশা করেনি।
বিপরীতে IEnumerable<T>
কংক্রিট অবজেক্টগুলির বিরুদ্ধে কার্যকর করা হয় এবং সুতরাং, রূপান্তরিত হবে না। সুতরাং, এটি বেশ সাধারণ যে কনস্ট্রাক্টসগুলি, যাগুলির সাথে ব্যবহারযোগ্য IEnumerable<T>
তা ব্যবহার করা যায় না IQueryable<T>
এবং IQueryables<T>
বিভিন্ন লিনকিউ সরবরাহকারীদের দ্বারা সমর্থিত একই ফাংশনগুলির সেটকে সমর্থন করে না।
যাইহোক, কিছু কর্মক্ষেত্র রয়েছে ( ফিলের জবাবের মতো ), যা কোয়েরিটি পরিবর্তন করে। এছাড়াও, আরও সাধারণ পদ্ধতির হিসাবে এটিতে ফিরে আসা সম্ভবIEnumerable<T>
ক্যোয়ারীর স্পেসিফিকেশনটি চালিয়ে যাওয়ার পূর্বে কোনওটিতে । তবে এটির একটি পারফরম্যান্স হিট হতে পারে - বিশেষত এটি যখন সীমাবদ্ধতার উপর ব্যবহার করা হয় (যেমন যেখানে ক্লজ)। বিপরীতে, রূপান্তরগুলির সাথে ডিল করার সময় পারফরম্যান্স হিট অনেক ছোট, কখনও কখনও অস্তিত্বও থাকে না - আপনার প্রশ্নের উপর নির্ভর করে।
সুতরাং উপরের কোডটিও এ জাতীয়ভাবে পুনরায় লেখা যেতে পারে:
return this.ObjectContext.BranchCostDetails
.AsEnumerable()
.Where(
b => b.TarrifId == tariffId && b.Diameter == diameter
|| (b.TarrifId==tariffId && !string.IsNullOrWhiteSpace(b.Diameter))
||(!b.TarrifId.HasValue) && b.Diameter==diameter
);
দ্রষ্টব্য: ফিলের উত্তরের চেয়ে এই কোডটির উচ্চতর পারফরম্যান্স প্রভাব পড়বে । তবে এটি নীতিটি দেখায়।
List<string> my = new List<string>(); var i = from m in my where !string.IsNullOrWhiteSpace(m) select m;