2010-03-29 10 views
6

क्या इस कोड को फिर से संसाधित किया जा सकता है? केवल अंतर ही भाग द्वारा क्रम है।LINQ क्वेरी को या तो एक ही प्रश्न में आरोही या अवरोही की आवश्यकता है

Idealy मैं तो कोड पुन: प्रयोज्य है, लेकिन मैं कैसे सशर्त जोड़ने के लिए जानते हैं और न निकालें क्वेरी ऑपरेटरों OrderBy और OrderByDescending

var linq = new NorthwindDataContext(); 

     var query1 = linq.Customers 
      .Where(c => c.ContactName.StartsWith("a")) 
      .SelectMany(cus=>cus.Orders) 
      .OrderBy(ord => ord.OrderDate) 
      .Select(ord => ord.CustomerID); 

     var query2 = linq.Customers 
      .Where(c => c.ContactName.StartsWith("a")) 
      .SelectMany(cus => cus.Orders) 
      .OrderByDescending(ord => ord.OrderDate) 
      .Select(ord => ord.CustomerID); 

उत्तर

12

आप अपनी खुद की पुन: प्रयोज्य विस्तार विधि बना सकते हैं जो यह कर देगा है यदि:

public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> 
    (this IQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.OrderBy(keySelector) 
      : source.OrderByDescending(keySelector); 
} 

और इसी तरह ThenBy के लिए:

public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> 
    (this IOrderedQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.ThenBy(keySelector) 
      : source.ThenByDescending(keySelector); 
} 
+0

कूल। धन्यवाद जॉन –

+0

विषय से किंडा, लेकिन उपरोक्त अनुवाद LINQ2SQL के लिए सही ढंग से अनुवाद करेंगे? IOW यह एक 'असमर्थित' विधि देखने के लिए पर्याप्त चालाक है और इसे सिंटैक्स पेड़ बनाने और एसक्यूएल उत्पन्न करने से पहले इसे निष्पादित करता है? बस सोच रहा था, कभी कोशिश नहीं की। :) – leppie

+1

@leppie: यह केवल मौजूदा क्वेरी करने योग्य तरीकों में कॉल कर रहा है - वे अभिव्यक्ति वृक्ष का निर्माण करते हैं। ध्यान दें कि यह * इस समय * IENumerable 'के खिलाफ काम नहीं करेगा, हालांकि आप आसानी से बराबर एक्सटेंशन विधियों को लिख सकते हैं। –

0
नंबरों की सहायता से

, आदि एक प्रतिनिधि/लैम्ब्डा अभिव्यक्ति का उपयोग करना चाहते हैं आप आमतौर पर 'ऑर्डरिंग चर' को अस्वीकार कर सकते हैं।

DateTime के साथ, मुझे पूरा यकीन नहीं है। आप Timespan का उपयोग करने का प्रयास कर सकते हैं।

2

आप अपनी क्वेरी को बिट्स में विभाजित कर सकते हैं, और नियंत्रण प्रवाह तर्क का उपयोग कर सकते हैं। LINQ से SQL मैजिकल रूप से सही क्वेरी का निर्माण करेगा जैसे कि आपने इसे एक ही पंक्ति टाइप की थी! यह काम करने का कारण यह है कि जब तक आप डेटा का अनुरोध नहीं करते हैं तब तक क्वेरी डेटाबेस तक नहीं भेजी जाती है, बल्कि इसके बजाय अभिव्यक्ति के रूप में संग्रहीत होती है।

var linq = new NorthwindDataContext(); 
var query = linq.Customers 
    .Where(c => c.ContactName.StartsWith("a")) 
    .SelectMany(cus=>cus.Orders); 

IOrderedQueryable<Order> query2; 
if (useAscending) { 
    query2 = query.OrderBy(ord => ord.OrderDate); 
} else { 
    query2 = query.OrderByDescending(ord => ord.OrderDate); 
} 

var query3 = query2.Select(ord => ord.CustomerID); 
+0

त्रुटिकर्ता !!!!!!!!! चयन करने से पहले आपके ऑर्डरिंग की आवश्यकता होती है, अन्यथा आप एक अलग प्रकार से निपटते हैं :) – leppie

+0

धन्यवाद मार्क। क्या इससे कोई फर्क पड़ता है कि चयन ऑपरेटर द्वारा ऑर्डर चुनने के बाद रखा गया है()? –

+0

@leppie: हाँ, माफ करना मैंने उसे नोटिस नहीं किया! –

0

ठीक है, आप एक शर्त है, तो आप जहां तय आदेश से आरोही या अवरोही आप उपयोग कर सकते हैं इस

var query1 = linq.Customers 
.Where(c => c.ContactName.StartsWith("a")) 
.SelectMany(cus=>cus.Orders) 

if(SortAscending) 
    query1 = query1.OrderBy(ord => ord.OrderDate); 
else 
    query1 = query1.OrderByDescending(ord => ord.OrderDate); 

var query2 = query1.Select(ord => ord.CustomerID); 
+0

देखें, आपने नीचे दिए गए उत्तर के समान गलती की है (अब यह तय है)। – leppie

+0

@leppie: न केवल यह तय किया गया है, लेकिन यह अब ऊपर है, नीचे नहीं। तो आपकी टिप्पणी गलत है और शायद मददगार से ज्यादा भ्रमित है! संदर्भ का उपयोग करने की कोशिश करने के बजाए अपनी टिप्पणी दोहराएं क्यों न करें? दूसरे शब्दों में, बस इसे लिखें: 'आपके आदेश को चुनने से पहले होने की आवश्यकता है, अन्यथा आप एक अलग प्रकार से निपट रहे हैं'। ;-) –

+0

वहां, इसे ठीक किया गया। हालांकि मुझे लगता है कि मैं जोन का जवाब भी अपने स्वयं को पसंद करता हूं ;-) –

1
return from T in bk.anbarsabts 
     where T.kalaname == str 
     orderby T.date descending 
     select new { T.date, T.kalaname, T.model, T.tedad }; 
संबंधित मुद्दे