c# - सूची() के बजाय AsQueryable() का उपयोग क्यों करें?




linq repository (3)

AsQueryable सिर्फ एक क्वेरी बनाता है, एक सूची पाने के लिए आवश्यक निर्देश। आप बाद में क्वेरी में भविष्य में परिवर्तन कर सकते हैं जैसे नए जोड़ना, जो डेटाबेस स्तर पर सभी तरह से भेजे जाते हैं।

AsList स्मृति में सभी वस्तुओं के साथ एक वास्तविक सूची देता है। यदि आप एक नया जोड़ते हैं, जहां पर इसका उपयोग किया जाता है, तो आपको डेटाबेस को तेज़ फ़िल्टरिंग नहीं मिलता है। इसके बजाय आपको सूची में सारी जानकारी मिलती है और फिर उस एप्लिकेशन को फ़िल्टर करें जिसे आपको एप्लिकेशन में आवश्यकता नहीं है।

तो मूल रूप से यह स्वयं को करने से पहले आखिरी संभव क्षण तक इंतजार करने के लिए नीचे आता है।

https://code.i-harness.com

मैं गैर-टेस्ट रिपोजिटरी के कार्यान्वयन के आधार के रूप में इकाई फ्रेमवर्क और LINQ साथ डेटा पहुंच के लिए रिपोजिटरी पैटर्न का उपयोग कर रहा हूं। अधिकांश नमूनों को मैं वापस देखता हूं Asquable () जब कॉल सूची <T> के बजाय एन रिकॉर्ड देता है। ऐसा करने का क्या फायदा है?


रिटर्निंग IQueryable<T> का लाभ है, निष्पादन निष्पादक है जब तक आप वास्तव में परिणाम की गणना शुरू नहीं करते हैं और आप क्वेरी को अन्य प्रश्नों के साथ लिख सकते हैं और फिर भी सर्वर पक्ष निष्पादन प्राप्त कर सकते हैं।

समस्या यह है कि आप इस विधि में डेटाबेस संदर्भ के जीवनकाल को नियंत्रित नहीं कर सकते हैं - आपको एक खुले संदर्भ की आवश्यकता है और यह सुनिश्चित करना चाहिए कि क्वेरी निष्पादित होने तक यह खुला रहता है। और फिर आपको यह सुनिश्चित करना होगा कि संदर्भ का निपटारा किया जाएगा। यदि आप परिणाम को एक List<T> , T[] , या कुछ समान के रूप में वापस करते हैं, तो आप रचित किए गए निष्पादन और सर्वर की तरफ से निष्पादित प्रश्नों के निष्पादन को हटा देते हैं, लेकिन आप डेटाबेस संदर्भ के जीवनकाल पर नियंत्रण जीतते हैं।

सबसे अच्छा फिट बैठता है, ज़ाहिर है, वास्तविक आवश्यकताओं पर निर्भर करता है। यह एक और सवाल के बिना एक और सवाल है।


AsQueryable IEnumerable<T> लिए एक एक्सटेंशन विधि है जो दो चीजें कर सकती है:

  • यदि IEnumerable<T> IQueryable<T> IEnumerable<T> लागू करता है, कुछ भी नहीं करता है।
  • अन्यथा 'नकली' IEnumerable<T> ( EnumerableQuery<T> ) बनाता है जो लैम्बडास को संकलित करने और गणना करने योग्य एक्सटेंशन विधियों को कॉल करने वाली प्रत्येक विधि को लागू करता है।

इसलिए AsQueryable का उपयोग करने वाले अधिकांश मामलों में बेकार है, जब तक कि आपको किसी विधि के लिए IQueryable पास करने के लिए मजबूर नहीं किया जाता है और आपके पास एक आईनेमरेबल है, यह एक हैक है।

नोट: AsQueryable एक हैक है, निश्चित रूप से IQueryable नहीं है!