2012-06-05 16 views
6

मुझे उत्सुकता है कि एंटीटी फ्रेमवर्क का उपयोग करते समय कॉल श्रृंखला में कॉल किया जाना चाहिए। विधि निम्नलिखित पर विचार करें:जहां कॉल श्रृंखला में शामिल होना चाहिए() ईएफ LINQ एक्सटेंशन को रखा जाना चाहिए?

// sample usage from service layer 
// _customerRepository.Paginate(1, out totalRecords, 25, "DateJoined DESC, AmountSpent", "DateJoined >= '2009-02-01'", "Invoices, Refunds"); 
public virtual IQueryable<T> Paginate(int page, out int total, int pageSize, string sort = "Id", string filter = null, string includes = null) 
{ 
    IQueryable<T> query = DatabaseSet; 

    total = query.Count(); // get total # of records (required for pagination)... 
    var skipTo = GetValidSkipCount(page, total, pageSize); 

    if (!String.IsNullOrWhiteSpace(filter)) 
    { 
     query.Where(filter); 
    } 
    // should includes be before filtering? 
    // should query.Count() be called after query.Include? 
    // does it matter? 
    if (!String.IsNullOrWhiteSpace(includes)) 
    { 
     query.IncludeMany(includes); // my own extension that takes comma separated string of entities to include 
    } 

    return query.OrderBy(sort).Skip(skipTo).Take(pageSize); 
} 

मेरे प्रश्न हैं:

  1. को शामिल करना चाहिए हमेशा कॉल श्रृंखला में पहला हो सकता है?
  2. क्या गणना() को शामिल करके प्रभावित किया जाता है? यदि ऐसा है तो मुझे लगता है कि मुझे
  3. शामिल करने के बाद गणना करना चाहिए (फ़िल्टर) पहले या बाद में होना चाहिए?
  4. क्या वास्तव में कोई फर्क पड़ता है क्योंकि ईएफ सबकुछ जानने के लिए पर्याप्त "स्मार्ट" है?

उत्तर

10

कॉल श्रृंखला में हमेशा पहले होना चाहिए?

Include श्रृंखला में पहला होना आवश्यक नहीं है। Include बहुत खास ऑपरेटर है जो क्वेरी का हिस्सा नहीं है। यह क्वेरी के विस्तार की तरह है। यह LINQ ऑपरेटर भी नहीं है - यह ObjectQuery<T> (IQueryable<T> एक्सटेंशन और DbQuery<T> संस्करण दोनों पर आंतरिक रूप से इस कार्यान्वयन के लिए प्राप्त ईएफ ऑपरेटर है)। T क्वेरी के आकार और रूट को Include के लिए परिभाषित करता है। Include केवल तभी उपयोग किया जाता है जब क्वेरी मिलान रूट का परिणामी आकार Include कॉल में उपयोग किया जाता है। इसलिए यदि आप पर कॉल करने के लिए Include जोड़ते हैं और आपकी क्वेरी IQueryable<T> आपके Include पर लागू होती है, लेकिन यदि आपकी क्वेरी उदाहरण के लिए IQueryable गुमनाम प्रकार के रूप में लौटाती है तो आपने क्वेरी का आकार बदल दिया है और Include लागू नहीं है।

क्या गणना() को शामिल करके प्रभावित किया जाता है? यदि ऐसा है तो मुझे लगता है मैं गणना करना चाहिए के बाद शामिल करें यदि आप क्वेरी पर Count निष्पादित

Include नहीं किया जाता है। Count क्वेरी निष्पादित करता है और यह डेटा रिकॉर्ड सेट वापस नहीं करता है - यह आकार बदलता है और इसमें शामिल करने के लिए कुछ भी नहीं है।

फ़िल्टरिंग (कहां) से पहले या बाद में होना चाहिए?

इससे कोई फर्क नहीं पड़ता। शामिल हों शामिल है और मैं उम्मीद करता हूं कि ईएफ (क्वेरी बनाते समय) और डेटाबेस में क्वेरी इंजन (क्वेरी निष्पादित करते समय) में शामिल होने से पहले फ़िल्टरिंग का उपयोग करना चाहिए।

क्या वास्तव में कोई फर्क पड़ता है क्योंकि ईएफ सबकुछ जानने के लिए पर्याप्त "स्मार्ट" है?

यह केवल तभी मायने रखता है जब आप क्वेरी का आकार बदलते हैं - आप प्रक्षेपण या कस्टम शामिल होते हैं। ऐसे मामले में Include पूर्व आकार का खो जाएगा (बिल्कुल उपयोग नहीं किया जाता है)।

+0

बस एक नोट/प्रश्न, क्या आप उत्सुक लोडिंग के दौरान भी शामिल नहीं हैं? – Zapnologica

संबंधित मुद्दे