2012-12-28 18 views
5

मैं निम्नलिखित pseudoquery के साथ एक समस्या में चल रहा हूँ:दो समान LINQ प्रश्नों, पूरी तरह से अलग उत्पन्न एसक्यूएल

var daily = from p in db.table1 
      group p by new 
      { 
       key1, 
       key2 
      } into g 
      join d in db.table2 
      on new { p.key1, p.key2 } equals { d.key1, d.key2 } 
      select new 
      { 
       col1 = g.Key.key1 
       col2 = g.Sum(a => a.column2) 
       col3 = d.column3 
      }; 

यह चलता है, लेकिन उत्पन्न एसक्यूएल बयान LINQ एसक्यूएल सर्वर को भेजता है बेतुका है। वास्तविक कार्यान्वयन उपरोक्त के समान 7 या उससे अधिक कॉलम के साथ एक समान सेटअप का पालन करता है जिसमें प्रत्येक के पास .Sum() गणना होती है। जेनरेट किए गए एसक्यूएल में कहीं भी 10-11 घोंसला वाले चयन कथन नहीं हैं जिनमें कोई भी शामिल नहीं है और, ज़ाहिर है, हमेशा के लिए दौड़ने के लिए लेता है।

मैं क्वेरी का एक और कार्यान्वयन बाहर का परीक्षण किया:

var daily = from p in 
       (from p in db.table1 
       group p by new 
       { 
        key1, 
        key2 
       } into g 
       select new 
       { 
        col1 = g.Key.key1, 
        col2 = g.Sum(a => a.column2) 
       }) 
      join d in db.table2 
      on new { p.key1, p.key2 } equals new { d.key1, d.key2 } 
      select new 
      { 
       col1 = p.col1, 
       col2 = p.col2, 
       col3 = d.column3 
      }; 

इस संस्करण में एक भी उप-चयन और एक आंतरिक शामिल हों बयान के साथ कहीं अधिक उचित एसक्यूएल उत्पन्न करता है (यह भी लानत चलाता पास तुरन्त)। जिस चीज से मुझे नफरत है वह यह है कि पहली LINQ क्वेरी आईएमएचओ है, जो कि अधिक सीधी और आगे है, जबकि दूसरी अपेक्षाकृत अनावश्यक लगती है क्योंकि मैं तालिका 1 से दो कॉलम को परिभाषित करने के लिए समाप्त होता हूं।

ये दो समान प्रश्न सर्वर पर इतने अलग तरीके से क्यों प्रदर्शन करते हैं और क्वेरी 2 क्यों अधिक कुशल होता है, भले ही यह कोड बहुत कम अभिव्यक्तिपूर्ण हो?

क्या कोई तरीका है कि मैं दूसरी क्वेरी के रूप में पहली क्वेरी को फिर से लिख सकता हूं?

+0

क्या आप दोनों संस्करणों के एसक्यूएल पोस्ट कर सकते हैं? – usr

+0

@usr निश्चित रूप से, मुझे इसे पहले थोड़ा साफ करने की कोशिश करें जैसे मैंने LINQ क्वेरी के लिए किया था। – Kittoes0124

+0

@ किटटोस आप लिंक लिखने के लिए [** लिंककैड **] (http://www.linqpad.net/) का उपयोग कर सकते हैं और लैम्ब्डा और एसक्यूएल कोड – balexandre

उत्तर

6

LINQ 2 एसक्यूएल निम्नलिखित पैटर्न के साथ एक समस्या है:

from t in table 
group t by key into g 
from t in g //"ungroup" the grouping - this is causing a problem 
select ... 

मुझे लगता है कि आपके शामिल होने कि ट्रिगर कर रहा है क्योंकि यह "ungroups" समूह। ध्यान दें कि LINQ जुड़ना GroupJoin है जो SQL में अनुपलब्ध है। इसके बारे में सोचें: आप मेरी उदाहरण क्वेरी का अनुवाद कैसे करेंगे? आपको tabletable के समूहबद्ध संस्करण में शामिल होना है जो पागल रिडंडेंसी का कारण बनता है।

मैंने इस समस्या को कुछ बार देखा है। आपको सही काम मिल गया है: इस पैटर्न को होने से रोकने के लिए एक प्रोजेक्शन को बल दें।

एक थोड़ा कम अजीब संस्करण है:

var daily = from p in db.table1 
      group p by new 
      { 
       key1, 
       key2 
      } into g 
      select new 
      { 
       col1 = g.Key.key1, 
       col2 = g.Sum(a => a.column2) 
      } into p 
      join d in db.table2 on new { p.key1, p.key2 } equals new { d.key1, d.key2 } 
      select new 
      { 
       col1 = p.col1, 
       col2 = p.col2, 
       col3 = d.column3 
      }; 

घोंसले कम ज्ञात select x into y वाक्य रचना से हटा दिया है।

+0

अरे, मैं वास्तव में उम्मीद कर रहा था कि वह जवाब नहीं था। मुझे वास्तव में तालिका 2 में से एक कॉलम प्राप्त करने के लिए टेबल 1 में अपने सभी कॉलम को परिभाषित करने से नफरत है। लेकिन मुझे लगता है कि ऐसा नहीं लगता कि मेरे पास इस मामले में कोई विकल्प है। – Kittoes0124

+0

@ किटटोस जो इसके बारे में भी मेरी भावना है। दूसरी तरफ LINQ इतना काम बचाता है कि इन बुरा किनारे के मामलों को सहन करने के लायक है। मेरी इच्छा है कि ईएफ टीम सक्षम LINQ समर्थन प्रदान करेगी या एल 2 एस को त्याग दिया नहीं गया था ... – usr

+1

ओह, निश्चित रूप से। LINQ बचाता है जो अन्य काम की मात्रा बिल्कुल हास्यास्पद है, इसलिए ऐसा होने पर इस तरह की चीजों को सहन करने के लिए पूरी तरह से लायक है।बस मुझे वास्तविक कारणों के लिए 10 कॉलम + दो बार परिभाषित पागल ड्राइव करता है। यह क्यों हो रहा है यह बताने के लिए बहुत बहुत धन्यवाद। – Kittoes0124

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