2011-04-23 31 views
11

के लिए ऑर्डरबी अभिव्यक्ति बनाएं मैं संकल्पना का सबूत बना रहा हूं जो गतिशील और ऑर्डरबाय के लिए लैम्ब्डा/LINQ का उपयोग करता है। निम्न कोड कहां अभिव्यक्ति के लिए काम करता है, लेकिन मैं यह नहीं समझ सकता कि अभिव्यक्ति द्वारा ऑर्डर कैसे बनाया जाए। इस उदाहरण के लिए, यदि संभव हो तो मैं इसे सरल रखना चाहता हूं; मैं कोड लिखना नहीं चाहता जो एक अभिव्यक्ति वृक्ष को संशोधित करता है।LINQ/Lambda

void Main() 
{ 
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0)); 
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;  
    List<Products> products = GetProducts(filter, Products); 
    Console.WriteLine(products); 
} 

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter, Table<Products> Products) 
{ 

    var products = Products.Where(filter); 
    return products.ToList(); 
} 

जो मैं चाहता हूं वह निम्न के जैसा है लेकिन अभिव्यक्ति द्वारा क्रम बनाने के लिए कोड को नहीं समझ सकता।

void Main() 
{ 
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0)); 
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ; 
    Expression<Func<Products, ????>> orderBy = d => ??????; 

    List<Products> products = GetProducts(filter, orderBy, Products); 
    Console.WriteLine(products); 
} 

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter, 
       Expression<Func<Products, ???>> orderBy, Table<Products> Products) 
{ 

    var products = Products.Where(filter).OrderBy(orderBy); 
    return products.ToList(); 
} 

यदि आप सोच रहे हैं, तो मैं अवधारणा के इस सबूत के लिए लिंककैड का उपयोग कर रहा हूं।

उत्तर

17
private static List<Products> GetProducts<TOrderBy>(Expression<Func<Products, bool>> filter, 
       Expression<Func<Products, TOrderBy>> orderBy, Table<Products> Products) 
{ 

    var products = Products.Where(filter).OrderBy(orderBy); 
    return products.ToList(); 
} 

आप OrderBy विस्तार विधि को देखें, तो यह एक Expression<Func<T, TOrderBy>> स्वीकार करता है क्योंकि अभिव्यक्ति

.OrderBy(x => x.ID) // <T, int> 
.OrderBy(x => x.Name) // <T, string> 

निर्भर करता है तो वजह अपने आवरण विधि है कि जेनेरिक प्रकार स्वीकार करने के लिए पारित करने में सक्षम होने की जरूरत है किसी भी प्रकार की हो सकती है । में

+0

उत्तर के लिए धन्यवाद, लेकिन मैं टॉडरबी का संदर्भ कैसे दूं? –

+0

आप नहीं करते हैं, यह ऑर्डर द्वारा पैरामीटर द्वारा उपयोग किया जाता है। 'अभिव्यक्ति > orderBy' –

+1

दूसरों की सहायता करने के लिए। ऑर्डर बनाने के लिए अभिव्यक्ति 'अभिव्यक्ति > orderBy = d => d.Price;' जैसी कुछ करें। जहां मूल्य एक दशमलव प्रकार है। पिछले कोड में, दशमलव किसी भी प्रकार का हो सकता है, जैसे डेटटाइम, स्ट्रिंग, या int। इस प्रकार को एक्सप्रेशन से लौटाए गए प्रकार से मेल खाना चाहिए। यदि डेटटाइम का उपयोग किया जाता है, तो लैम्ब्डा अभिव्यक्ति डी.क्रेटेडडेट जैसी कुछ होनी चाहिए। –

12

क्या आप के लिए देख रहे हैं:

Expression<Func<Products, dynamic>>; 

दोनों अभिव्यक्तियों को पकड़ने के लिए संरचना/कक्षा बनाने का प्रयास करें और यदि यह आरोही या अवरोही हो।