मैं निम्नलिखित 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 क्यों अधिक कुशल होता है, भले ही यह कोड बहुत कम अभिव्यक्तिपूर्ण हो?
क्या कोई तरीका है कि मैं दूसरी क्वेरी के रूप में पहली क्वेरी को फिर से लिख सकता हूं?
क्या आप दोनों संस्करणों के एसक्यूएल पोस्ट कर सकते हैं? – usr
@usr निश्चित रूप से, मुझे इसे पहले थोड़ा साफ करने की कोशिश करें जैसे मैंने LINQ क्वेरी के लिए किया था। – Kittoes0124
@ किटटोस आप लिंक लिखने के लिए [** लिंककैड **] (http://www.linqpad.net/) का उपयोग कर सकते हैं और लैम्ब्डा और एसक्यूएल कोड – balexandre