2010-03-12 15 views
5

यहाँ मेरी LINQ क्वेरी है:OrderBy और अलग LINQ करने वाली संस्थाओं का उपयोग कर

SELECT 
[Distinct1].[MyColumn] AS [MyColumn] 
FROM (SELECT DISTINCT 
    [Extent1].[MyColumn] AS [MyColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Distinct1] 

:

{"a", "c", "b", "d"} 

यहाँ उत्पन्न एसक्यूएल है:

(from o in entities.MyTable 
orderby o.MyColumn 
select o.MyColumn).Distinct(); 

यहाँ नतीजा है क्या यह एक बग है? मेरा आदेश कहां है, लानत?

उत्तर

10

आपDistinct के बाद सॉर्ट चाहिए क्योंकि यह आदेश संरक्षण के बारे में कोई गारंटी के साथ नहीं आता:

entities.MyTable.Select(o => o.MyColumn).Distinct().OrderBy(o => o); 
+0

यह कोड संकलित नहीं करता है। ऑर्डरबी त्रुटि देता है: 'प्रकार के तर्कों को उपयोग से अनुमानित नहीं किया जा सकता है। टाइप तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें। ' –

+0

ओह, मुझे लगता है कि इसे' ऑर्डरबी (ओ => ओ) 'होना चाहिए क्योंकि उस बिंदु से आइटम पहले से ही चुने गए हैं (और हम 'IQueryable ') के साथ काम कर रहे हैं। मैंने आपका कोड तय कर लिया है और आपको चेकमार्क दिया है - धन्यवाद! –

+0

@ ब्लूराजा: हाँ, उसे याद आया। सुधारों के लिए धन्यवाद! –

1

यह सवाल वस्तुओं के लिए LINQ के लिए नियमों की चर्चा: Preserving order with LINQ

में डेटाबेस, यहां तक ​​कि कम संचालन आदेश को संरक्षित करते हैं। डिस्टिंटिंग (आमतौर पर एक हैश एल्गोरिदम का उपयोग किया जाता है) के दौरान कोई भी आदेश को संरक्षित नहीं करता है।

+0

फिर भी, क्वेरी 'SELECT DISTINCT ... द्वारा आदेश ...' जैसा कि आप SQL सर्वर में अपेक्षा करते हैं, और अन्य डीबीएमएस की संभावना है - क्या ऐसा कोई कारण है कि 'ऑर्डरबी' LINQ क्लॉज को इस मामले में केवल अनदेखा किया जाता है जब उत्पन्न होता है एसक्यूएल (यह कम से कम एक त्रुटि फेंक सकता है)? मुझे अभी भी लगता है कि यह एक बग है - 'स्ट्रिंग [] 'पर उपयोग किए जाने पर LINQ क्वेरी सही तरीके से काम करती है। –

+0

यदि आप क्वेरी प्लान की जांच करते हैं, तो यह पता चलता है कि ORDER BY DISTINCT के बाद होता है। ऐसे में, ORDER BY में क्या दिखाई दे सकता है पर सख्त सीमाएं हैं। यह एक और मामला है जहां एसक्यूएल के वाक्यविन्यास भ्रम का कारण बनता है। –

+0

"क्वेरी प्लान" क्या है, और मैं इसे कैसे देखूं? मैंने SQL सर्वर 2008 प्रोफाइलर का उपयोग कर उपर्युक्त क्वेरी प्राप्त की है, लेकिन यह स्पष्ट रूप से केवल आपको अंतिम क्वेरी देता है। –

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