इस मामले में IQueryable<T>
और के बीच अंतर करना महत्वपूर्ण है IEnumerable<T>
। संक्षेप IQueryable<T>
में एक LINQ प्रदाता द्वारा एक अनुकूलित क्वेरी देने के लिए संसाधित किया जाता है। इस परिवर्तन के दौरान सभी C # कथनों का समर्थन नहीं किया जाता है, क्योंकि या तो उन्हें बैक-एंड विशिष्ट क्वेरी (जैसे SQL) में अनुवाद करना संभव नहीं है या क्योंकि कार्यान्वयनकर्ता ने कथन की आवश्यकता का पूर्वाभास नहीं किया है।
इसके विपरीत IEnumerable<T>
ठोस वस्तुओं के खिलाफ निष्पादित किया जाता है और इसलिए, रूपांतरित नहीं किया जाएगा। इसलिए, यह काफी सामान्य है कि निर्माण, जो प्रयोग करने योग्य हैं IEnumerable<T>
, के साथ उपयोग नहीं किया जा सकता है IQueryable<T>
और यह भी कि IQueryables<T>
विभिन्न LINQ प्रदाताओं द्वारा समर्थित कार्यों के एक ही सेट का समर्थन नहीं करते हैं।
हालाँकि, कुछ वर्कअराउंड्स हैं (जैसे फिल का उत्तर ), जो क्वेरी को संशोधित करता है। इसके अलावा, एक अधिक सामान्य दृष्टिकोण 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
);
नोट: Ths कोड पर Phil के उत्तर की तुलना में उच्च प्रदर्शन प्रभाव पड़ेगा । हालाँकि, यह सिद्धांत को दर्शाता है।
List<string> my = new List<string>(); var i = from m in my where !string.IsNullOrWhiteSpace(m) select m;