2012-03-19 16 views
13

निम्न मूल LINQ से SQL कथन का परिणाम ऑर्डरबाय काम नहीं करता है। जैसा कि आप टी-एसक्यूएल में देख सकते हैं वहां कोई ऑर्डर नहीं है। तुम जानते हो क्यों? एसक्यूएल कोLINQ से SQL का उपयोग तब होता है जब DISTINCT का उपयोग किया जाता है?

LINQ:

 var results = (from stats in db.t_harvest_statistics 
         orderby stats.unit_number 
         select stats.unit_number).Distinct().ToList(); 

TSQL

SELECT 
[Distinct1].[unit_number] AS [unit_number] 
FROM (SELECT DISTINCT 
[Extent1].[unit_number] AS [unit_number] 
FROM [dbo].[t_harvest_statistics] AS [Extent1] 
    ) AS [Distinct1] 
+0

एक पहचान स्तंभ unit_number है प्राप्त करने के बाद इस

var results = (from stats in db.t_harvest_statistics select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList(); 

कोशिश? – asawyer

+0

नहीं, unit_number पहचान नहीं है। यह एक int डेटा प्रकार – KeelRisk

उत्तर

28

निम्नलिखित में से ऊपर परिणाम एसक्यूएल और संबंधपरक जहां आदेश द्वारा संबंध में है की बीजगणित के सीमा है कि DISTINCT के लिए।

ऑर्डर द्वारा "आगे" बाहर होना चाहिए ("शीर्ष स्तर" पर) क्योंकि यह देखें ऑपरेशन है। जबकि एक एसक्यूएल लिख सकता है जिसमें आरए ऑपरेशन के संबंध में "आगे में" द्वारा ORDER है, यह अक्सर अनिर्धारित व्यवहार (जो कभी-कभी काम करता है) में परिणाम देता है। इस प्रकाश में यह समझ में आता है कि Linq2Sql को अनदेखा करने के लिए स्वतंत्र है, हालांकि, शायद एक अपवाद बेहतर होगा ... यह वैसे भी कम सूक्ष्म होगा ;-) (असल में, यह समस्या लिंक प्रदाता के लिए मौजूद है जो विलुप्त होने की "कठोर" परिभाषा प्रदान नहीं करता है।

Distinct() हटाएं और Linq2Sql को एक बार फिर ऑर्डर द्वारा अपेक्षित रूप से उत्पन्न करना चाहिए। समाधान केवल संचालन के क्रम को स्विच करने के लिए है ताकि ऑर्डर बीई एक बार फिर "शीर्ष स्तर" पर हो।

यह लेख Use of Distinct and OrderBy in LINQ द्वारा कवर किया जाता:

यह व्यवहार अजीब दिखाई दे सकता है। समस्या यह है कि विशिष्ट ऑपरेटर यह नहीं देता है कि यह मूल्यों के मूल क्रम को बनाए रखेगा। LINQ से SQL तक लागू, इसका मतलब यह है कि क्वेरीए जैसे क्वेरी के मामले में एक प्रकार की बाधा को अनदेखा किया जा सकता है।

समाधान बहुत रों है [i] mple: निम्नलिखित queryB परिभाषा की तरह, अलग से एक के बाद OrderBy ऑपरेटर डाल:

var queryB = 
    (from o in db.Orders 
    select o.Employee.LastName) 
    .Distinct().OrderBy(n => n); 

मुबारक कोडिंग।

+1

है मैं थोड़ा उलझन में हूं (एन => एन) ... लेकिन यह काम करता है! – KeelRisk

+1

@ किलरिस्क 'ऑर्डरबी' को कुछ चाहिए क्योंकि 'ऑर्डरबी()' अधिभार नहीं है (जो, यदि यह अस्तित्व में है, तो उसी तरह परिभाषित किया जाएगा)। मुझे लगता है कि 'ऑर्डरब्य स्वयं' के मामले को पर्याप्त विशेष होने के लिए निर्धारित नहीं किया गया था ;-) –

0

लेनदेन तालिका से वर्ष क्रमबद्ध करते समय मुझे एक ही समस्या मिली।

अलग मूल्य पद्धति का उपयोग orderby