2009-09-18 4 views
6

ठीक है मुझे यहां एक स्वच्छता जांच की आवश्यकता है ...एक संकलित क्वेरी कब करता है जो IQueryable निष्पादन देता है?

मैंने एक क्वेरी संकलित की है जो निष्पादित होने पर एक IQueryable देता है।

निम्नलिखित उदाहरण में क्वेरी को वास्तव में डेटाबेस के विरुद्ध किस पंक्ति में निष्पादित करना चाहिए?

101 IQueryable<T> results = MyCompiledQuery(MyDataContext); 
102 List<T> final = (from t in result 
103     where t.ID > 5 
104     select t).ToList<T>(); 

यहाँ कैसे मैं अतिरिक्त चर्चा के लिए संकलित क्वेरी

public static Func<MyDataContext, IQueryable<Widget>> MyCompiledQuery= 
     CompiledQuery.Compile<MyDataContext, IQueryable<Widget>>(
         (MyDataContext db) => 
         from w in db.Widgets 
         where ((w.Type == WidgetType.Atype || //Widget.Atype is a Linq to Sql object, that I've defined statically 
           w.Type == WidgetType.Btype || //See above comment 
           w.Type == WidgetType.Ctype) && //See above comment 
           w.Location == WidgetLocation.Domestic) //Samething applies here 
         select euc); 

परिभाषित करने के लिए कृपया संदर्भ लें है: "। लाइन 104 पर, जब ToList रूपांतरण कर रही" LINQ to SQL compiled queries and when they execute

उत्तर

2

अच्छा, यह उत्तर गलत है। हम लाइन 101 पर MyCompiledQuery चर में संग्रहीत प्रतिनिधि को आमंत्रित करते हैं जो संकलित क्वेरी का परिणाम देता है, क्वेरी स्वयं ही नहीं।

+0

लाइन 104 पर कोई बयान नहीं है। वहां ब्रेकपॉइंट सेट करने का प्रयास करें ... – Guffa

+0

मुझे लगता है कि यह क्वेरी वास्तव में लाइन 101 पर निष्पादित होती है (यहां तक ​​कि ToList को कॉल करने से पहले)। – lahsrah

+0

सं। लाइन 101 क्वेरी बनाता है। वास्तविक डेटा प्राप्त होने पर क्वेरी निष्पादित की जाती है। – alex

2

यह लाइन 104 पर निष्पादित होता है (जब आप ToList() को कॉल करते हैं)।

एक संकलित क्वेरी एक क्वेरी है जिसे निष्पादन से पहले हर समय के बजाय संकलन समय पर केवल एक बार टीएसक्यूएल में अनुवाद किया जाता है।

+0

लाइन 104 पर कोई बयान नहीं है। वहां ब्रेकपॉइंट सेट करने का प्रयास करें ... – Guffa

+0

आप सही हैं, लेकिन आप बाल विभाजित कर रहे हैं। ToList 104 पर है, 102 नहीं। यह एक चाल सवाल नहीं है, और वह जानना चाहता था कि क्वेरी को संकलित करने का मतलब है कि यह तुरंत निष्पादित होता है, न कि 3 लाइनों में से एक कथन है। – Alan

+0

मुझे लगता है कि यह 102/104 पर निष्पादित होता है लेकिन जब मैं एक डीबगर और एसक्यूएल प्रोफाइलर चलाता हूं, तो मुझे 101 निष्पादन के बाद एक SQL कथन चलाया जाता है और फिर 12 SQL स्टेटमेंट्स (101 पर प्रत्येक परिणाम के लिए एक) 102 पर चलता है/104 –

0

इसे डिफरर्ड निष्पादन कहा जाता है।
आप here पर एक अच्छी पोस्ट पढ़ सकते हैं।

+0

हाँ, मैंने यही सोचा, और मैंने अपना आवेदन कैसे डिजाइन किया। हालांकि जब ऐप लाइन 101 निष्पादित करता है, तो मुझे एसक्यूएल प्रोफाइलर द्वारा एसक्यूएल स्टेटमेंट फ्लाई दिखाई देता है, और उसके बाद लाइन 101 द्वारा लौटाए गए प्रत्येक परिणाम के लिए एक और SQL स्टेटमेंट देखें। –

+0

मैं पुष्टि कर सकता हूं कि एंटीलोगिक ने क्या पोस्ट किया है। क्वेरी 101 – lahsrah

+0

@ एंटिलोगिक पर क्वेरी निष्पादित: क्वेरी को संकलित करने की प्रक्रिया को डेटाबेस संरचना के बारे में जानकारी की आवश्यकता हो सकती है, लेकिन यह उस चरण में कोई भी डेटा नहीं लाती है। यदि ऐसा होता है, तो जब आप परिणाम का उपयोग करते हैं तो यह बाद में कुछ भी नहीं लाएगा। – Guffa

1

यह प्रश्न पंक्ति 101 पर निष्पादित करता है। मैंने इसे SQL प्रोफाइलर ट्रेस करके सत्यापित किया। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह एक संकलित क्वेरी है।

फ़िल्टरिंग जो आप बाद में कर रहे हैं> 5 स्मृति में किया जाता है।

+0

-1 फिर से ट्रेस की जांच करें। डेटाबेस संरचना के बारे में जानकारी की आवश्यकता होने पर कुछ ट्रैफिक हो सकता है, लेकिन वास्तविक क्वेरी इसे संकलित करके निष्पादित नहीं की जाती है। उदाहरण के लिए यह पृष्ठ स्पष्ट रूप से बताता है कि क्वेरी संकलित होने के बाद आप पैरामीटर मान प्रदान कर सकते हैं, यदि क्वेरी को निष्पादित किया गया तो यह संभव नहीं होगा: http://msdn.microsoft.com/en-us/library/bb896297.aspx – Guffa

+0

संकलित क्वेरी विधि को कॉल करने से क्वेरी को डेटाबेस पर चलने का कारण बनता है। मैंने इसे एक साधारण डेटाबेस के साथ कई बार चेक किया है। बेशक आप पैरामीटर मानों को पारित कर सकते हैं, मैं इसे निष्पादित करने के कारण संकलन कारणों को नहीं कह रहा हूं, मैं कह रहा हूं कि संकलित क्वेरी विधि को निष्पादित करने के कारण इसे निष्पादित करने का कारण बनता है और ** नहीं। .ToList() विधि। – lahsrah

0

जहाँ तक मुझे पता है कि IQueryable कभी निष्पादित नहीं होता है, यह केवल लिंक क्वेरी को एक क्वेरी करने योग्य प्रारूप में परिवर्तित करता है ताकि जब भी अनुरोध किया जाता है तो इसे निष्पादित किया जाता है।

इस मामले में मुझे लगता है कि इस पल में उस सूची में कनवर्ट करने के लिए कहा गया है, जिसके परिणामस्वरूप यह परिणाम पूछता है। और रेखा 102 और 104 के बारे में लड़ाई में कोई मुद्दा नहीं है क्योंकि दोनों एक पंक्ति का प्रतिनिधित्व करते हैं।

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