2012-09-04 10 views
12

क्या VB.NET की Aggregate क्वेरी 0xखंडों के साथ एक लिंक अभिव्यक्ति के पहले (बाहरी) खंड के रूप में उपयोग की जाने वाली क्वेरी को मोटे तौर पर त्रुटिपूर्ण कर दिया गया है क्योंकि प्रत्येक Into खंड अलग से निष्पादित किया जाता है?कुल मिलाकर मोटे तौर पर त्रुटिपूर्ण है क्योंकि खंड में प्रत्येक को अलग से निष्पादित किया जाता है?

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant in LINQ to SQL को "स्पष्ट" जवाब

Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max() 

हालांकि है, इस सवाल का जवाब वास्तव में Min और Max में से प्रत्येक को पुन: प्राप्त (और यदि आप Count और Average जैसे अन्य कुल कार्यों में शामिल हैं) अलग एसक्यूएल प्रश्नों में । इसे LINQPad में आसानी से देखा जा सकता है।

क्या कोई लेनदेन (या इन प्रश्नों को परमाणु बनाने वाला कुछ और है) LINQPad द्वारा नहीं दिखाया गया है, या यह एक दौड़ की स्थिति होने का इंतजार कर रहा है? (और इसलिए आपको उपरोक्त प्रश्न के उत्तर में दिखाए गए ट्रिक्स को एक से अधिक क्वेरी को मजबूर करने के लिए किया गया है।)

संक्षेप में, क्या Aggregate का उपयोग कर LINQ-to-SQL क्वेरी है जो एकाधिक समेकित करता है एक एकल (या कम से कम "परमाणु") क्वेरी में कार्य करता है?

(मैं यह भी कहना है "स्पष्ट" क्योंकि मेरे लिए स्पष्ट जवाब, Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin), वास्तव में पूरी तालिका में दो बार प्राप्त करता है, यहाँ तक कि जब अनुकूलित किया है, और उसके बाद का उपयोग करता Linq करने वाली संस्थाओं Min और Max परिणाम प्राप्त करने के लिए: -()

मैंने सोचा था कि Aggregate वीबी विशेष नहीं था, लेकिन सी # की तरह इस क्वेरी अभिव्यक्ति नहीं है यह लग रहा है, तो मैं करने के लिए बदल दिया है

+0

आप यह सत्यापित करने में सक्षम हो सकते हैं कि SQL सर्वर स्वयं का पता लगाकर प्रश्न लेनदेन में हैं या नहीं, इसे दिखाना चाहिए (लेकिन मुझे इसके बारे में 100% निश्चित नहीं है)। यदि प्रदर्शन एक प्रमुख चिंता नहीं है, हालांकि, आप पूरे डेटासेट को पढ़ने और बाद में एकत्र करने से बेहतर हैं (मूल रूप से, डेटा के स्नैपशॉट पर काम कर रहे हैं)। – Alex

+0

ध्यान दें कि मुझे उम्मीद है कि मेरी मूल 'इन्टो मिन (पी। ज़ोनमिन)' क्वेरी ऑप्टिमाइज़ हो जाएगी, क्योंकि क्वेरी के एसक्यूएल भाग अब समान हैं। शायद जिटर अभी भी इसे देख पाएगा, लेकिन LINQPad/o + नहीं था। –

+0

और जब आप केवल उन कार्यों के साथ एकत्रित होते हैं जो एसक्यूएल का समर्थन करता है तो डेटाबेस को एकत्रीकरण करने के लिए "निरंतर चाल से समूह करना" करना बेहतर होगा। –

उत्तर

0

मेरे व्यापक प्रश्न का उत्तर देने के लिए: Aggregate लेनदेन के बिना अलग-अलग एसक्यूएल प्रश्नों के उत्पादन के लिए टूटा हुआ है?

सभी LINQ का कारण यह हो सकता है कि यदि आप केवल SELECT में परिणाम प्राप्त करने के लिए सावधानी से अपने प्रश्नों को समायोजित नहीं करते हैं, और यह संभव नहीं हो सकता है, बिना "छोड़ देना", एक प्रश्न में एक बड़ा परिणाम पुनर्प्राप्त करना और फिर डेटा को कुल या अन्यथा कुशल बनाने के लिए लिंक-टू-ऑब्जेक्ट का उपयोग करना। उदाहरण के लिए This 'query'

तो आम तौर पर प्रोग्रामर तक यह सुनिश्चित करने के लिए कि LINQ प्रश्नों के आसपास लेनदेन जोड़े गए हैं जो एकाधिक प्रश्नों का कारण बन सकते हैं। हमें बस यह सुनिश्चित करने की आवश्यकता है कि कौन सी LINQ क्वेरी एकाधिक SQL क्वेरी में बदल सकती है।

1

ऑल्ट। hough यह निम्न सिंटैक्स का उपयोग कर सकल कीवर्ड का उपयोग नहीं करता है, आप एक ही क्वेरी में अनेक कार्यों कर सकते हैं:

Dim query = From book In books _ 
    Group By key = book.Subject Into Group _ 
    Select id = key, _ 
     BookCount = Group.Count, _ 
     TotalPrice = Group.Sum(Function(_book) _book.Price), _ 
     LowPrice = Group.Min(Function(_book) _book.Price), _ 
     HighPrice = Group.Max(Function(_book) _book.Price), _ 
     AveragePrice = Group.Average(Function(_book) _book.Price) 

वहाँ हालांकि सकल खंड कार्यान्वयन के साथ एक मुद्दा होना दिखाई देता है। नॉर्थविंड से निम्नलिखित क्वेरी पर विचार करें:

Aggregate o in Orders 
into Sum(o.Freight), 
Average(o.Freight), 
Max(o.Freight) 

यह समस्याएं 3 डेटाबेस अनुरोध हैं। पहले दो अलग-अलग कुल खंड करते हैं। तीसरा पूरी तालिका को क्लाइंट पर वापस खींचता है और क्लाइंट को क्लाइंट पर ऑब्जेक्ट्स के माध्यम से क्लाइंट पर करता है।

+1

हाँ, और यदि आप इसे 'समूह में कुंजी = 0 समूह' में बदलते हैं (और अनियंत्रित 'आईडी = कुंजी' ड्रॉप करते हैं, तो आपको मेरे द्वारा दिए गए प्रश्न के उत्तर में वर्णित "निरंतर समूह" चाल मिलती है पूरे टेबल पर समेकित करने की इजाजत दी जाती है। –

+0

मेरे नमूने में, मुझे समूह बनाना है। यदि आप इसे पूरी तालिका में चाहते हैं, तो आपकी निरंतर चाल ठीक काम करती है। –

+0

मुझे लगता है कि * आपका अगला बिंदु 'फ्रेट' प्रकार से संबंधित है, और किसी कारण से लिंक का मानना ​​है कि एसक्यूएल का 'MAX'' मैक्स' को वापस आने के बारे में सोचने के लिए एक अलग मूल्य वापस कर सकता है। लेकिन _3 __separate__ डेटाबेस अनुरोध_ मेरा प्रश्न है जिसके बारे में चिंतित है। –

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

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