2012-05-11 11 views
7

में जोड़े गए कई ऑर्डरब स्टेटमेंट के साथ लिंक क्वेरी मेरे पास एक webservice में एक विधि है जिसमें पैरामीटर है जिसके साथ उपयोगकर्ता यह तय कर सकते हैं कि वे अपने परिणामों को कैसे ऑर्डर करना चाहते हैं। यह List(Of String) है जो फ़ील्ड के नामों के क्रम में क्रमबद्ध करना चाहते हैं।एक लूप

मैं जानता हूँ कि मैं सामान्य रूप से इस मामले में निम्नलिखित

Dim test = Bars.OrderBy(Function(x) x.Foo) _ 
       .ThenBy(Function(x) x.Bar) _ 
       .ThenBy(Function(x) x.Test) 

कर हालांकि द्वारा एकाधिक स्तंभों पर आदेश इस काम नहीं करेगा कर सकते हैं के बाद से मैं नहीं श्रृंखला ThenBy समारोह क्योंकि मैं छँटाई आदेश जोड़ रहा कर सकते हैं एक पाश में ThenBy का उपयोग करने के लिए मुझे IOrderedQueryable संग्रह की आवश्यकता है। यह मैं इसे कैसे काम करने के लिए

Dim sortColumns = {"Foo", "Bar", "Test"} 
Dim query = From b in Bars 
For each column in sortColumns 
    Select Case column 
     Case "Foo" 
      query = query.Orderby(Function(x) x.Foo) 
     Case "Bar" 
      query = query.Orderby(Function(x) x.Bar) 
     Case "Test" 
      query = query.Orderby(Function(x) x.Test) 
    End Select 
Next 

Dim result = query.Select(Function(x) x.x).ToList() 
Return result 

निश्चित रूप से यह काम नहीं करेगा क्योंकि OrderBy किसी भी पिछले आदेश का स्थान ले लेगा नहीं देखना चाहेंगे। एकमात्र समाधान जिसे मैं सोच सकता हूं, पहले किसी अन्य चर पर सूची का ऑर्डर कर रहा है, इसलिए मेरे पास पहले से ही IOrderedQueryable संग्रह है लेकिन यह गलत दृष्टिकोण की तरह लगता है।

Dim bars As New List(Of Bar) 
Dim sortColumns = {"Foo", "Bar", "Test"} 
Dim query = bars.Select(Function(x) New With {.Temp = 1, .x = x}) _ 
       .OrderBy(Function(x) x.Temp) 

For Each column In sortColumns 
    Select Case column 
     Case "Foo" 
      query = query.ThenBy(Function(x) x.x.Foo) 
     Case "Bar" 
      query = query.ThenBy(Function(x) x.x.Bar) 
     Case "Test" 
      query = query.ThenBy(Function(x) x.x.Test) 
    End Select 
Next 

Dim result = query.Select(Function(x) x.x).ToList() 
Return result  
+0

"OrderBy किसी भी पिछले आदेश का स्थान ले लेगा"। झूठ। ऑर्डरबी पहले ऑर्डरिंग को संरक्षित करता है ... अर्थ: यह एक स्थिर पुन: ऑर्डरिंग है। इसका भी अर्थ है: वर्तमान क्रम में संबंधों को तोड़ने के लिए यह पूर्व आदेश का उपयोग करता है। तो: ऑर्डरबी (फू)। फिरबी (बार)। फिरबी (टेस्ट) ऑर्डरबी (टेस्ट) के समान है। ऑर्डर बी (बार)। ऑर्डरबी (फू) –

उत्तर

7

आप अपनी खुद की विस्तार विधि OrderByOrThenBy जो जांच करता है कि मूल्य पहले से ही एक IOrderedQueryable है, ThenBy का उपयोग करता है यदि ऐसा है तो और OrderBy अन्यथा लिख ​​सकते हैं। थोड़ा गंध, लेकिन करने के लिए बहुत मुश्किल नहीं है।

संपादित करें: सी # नमूना (untested):

public static class QueryableOrdering 
{ 
    public static IOrderedQueryable<TElement> OrderByOrThenBy<TElement, TKey> 
     (this IQueryable<TElement> source, 
     Expression<Func<TElement, TKey>> ordering) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 
     if (ordering == null) 
     { 
      throw new ArgumentNullException("ordering"); 
     } 
     var ordered = source as IOrderedQueryable<TElement>; 
     return ordered == null ? source.OrderBy(ordering) 
           : ordered.ThenBy(ordering); 
    } 
} 
+0

ए सी # नमूना ठीक होगा, मैं स्वयं रूपांतरण कर सकता हूं। –

+0

@FreekBuurman: पूरी तरह से untested, लेकिन मेरे संपादन देखें ... –

+0

यह एक अच्छा समाधान की तरह लग रहा है, धन्यवाद! –