2010-12-08 17 views
12

मैं LINQ का उपयोग करने के लिए कई करने के लिए जहां एक संग्रह पर स्थिति नहीं बल्कि कई और शर्तों (इस उदाहरण में है) की तुलना मेंगतिशील LINQ या शर्तों

IEnumerable<Object> items; 
items.Where(p => p.FirstName = "John"); 
items.Where(p => p.LastName = "Smith"); 
के अलावा

के समान है, मैं चाहता हूँ देख रहा हूँ एकाधिक या शर्तों के लिए।

संपादित क्षमा करें, मैं नहीं जानता कि कैसे इन स्थितियों के कई मैं इतना

items.Where(p => p.FirstName = "John" || p => p.LastName = "Smith") 

काम नहीं करेगा होगा स्पष्ट करने के लिए।

असल में, यहाँ है कि मैं क्या करने के लिए कोशिश कर रहा हूँ:

उत्तर

7

यह नामों की अपनी श्वेतसूची केवल कार्यावधि में जाना जाता है की तरह लगता है। शायद यह प्रयास करें:

string[] names = new string[] {"John", "foo", "bar"}; 

var matching = items.Where(x => names.Contains(x.Name)); 
+0

है यह मेरे लिए सुपर उपयोगी साबित हुआ क्योंकि मैं पहले से ही सिर्फ यह करने के लिए Linq गतिशील पुस्तकालय देख रहा था। धन्यवाद! – xleon

13

उपयोग PredicateBuilder:

मान लीजिए आप एसक्यूएल या इकाई की रूपरेखा क्वेरी कि किसी कीवर्ड-शैली खोज को लागू करता है करने के लिए एक LINQ लिखना चाहते हैं। दूसरे शब्दों में, एक प्रश्न पंक्तियों जिसका वर्णन कुछ या कीवर्ड का एक सेट के सभी शामिल हैं रिटर्न कि ...

आदर्श दृष्टिकोण गतिशील रूप से एक लैम्ब्डा अभिव्यक्ति पेड़ है कि एक या आधारित विधेय करता है निर्माण करने के लिए है ।

उन सभी चीजों में से जो आपको अभिव्यक्ति पेड़ मैन्युअल रूप से बनाने के लिए ड्राइव करेंगे, गतिशील भविष्यवाणियों की आवश्यकता एक सामान्य व्यावसायिक अनुप्रयोग में सबसे आम है। सौभाग्य से, सरल और पुन: प्रयोज्य विस्तार विधियों का एक सेट लिखना संभव है जो इस कार्य को मूल रूप से सरल बनाते हैं। यह हमारे PredicateBuilder वर्ग की भूमिका है ...

+0

अच्छी नौकरी, लेकिन LINQ से संस्थाओं और इकाई फ्रेमवर्क (6) के साथ काम नहीं करती है: LINQ अभिव्यक्ति नोड प्रकार 'Invoke' LINQ से इकाइयों में समर्थित नहीं है। –

10

आप .Union() उपयोग कर सकते हैं परिणाम है कि किसी भी हालत को संतुष्ट वापस जाने के लिए।

var results = items.Where(p => p.FirstName == "John") 
    .Union(items.Where(p => p.LastName == "Smith")); 

यह || ऑपरेटर का उपयोग करने के लिए अवर है। यह आपके संपादन से स्पष्ट नहीं है कि यह क्यों काम नहीं करेगा।

+0

संघ का उपयोग निश्चित रूप से एक स्मार्ट चाल है! इसके लिए +1। – Steven

0

आप Where क्लॉज गतिशील नहीं बना सकते हैं, लेकिन आप गतिशील रूप से उस लैम्ब्डा अभिव्यक्ति को बना सकते हैं जिसे आप पास करते हैं। सही Expression बनाएं, इसे संकलित करें और परिणामी लैम्ब्डा अभिव्यक्ति को खंड के पैरामीटर के रूप में पास करें।

संपादित करें:

ठीक है, लगता है आपके पास, हिस्सा है जहाँ आप मैन्युअल रूप से अभिव्यक्ति बनाने के लिए और इसके लिए PredicateBuilder उपयोग कर सकते हैं छोड़ सकते हैं के रूप में पहले से ही AS-CII से जवाब दे दिया।

2
public static Expression<Func<T, bool>> OrTheseFiltersTogether<T>(
     this IEnumerable<Expression<Func<T, bool>>> filters) 
    { 
     Expression<Func<T, bool>> firstFilter = filters.FirstOrDefault(); 
     if (firstFilter == null) 
     { 
      Expression<Func<T, bool>> alwaysTrue = x => true; 
      return alwaysTrue; 
     } 

     var body = firstFilter.Body; 
     var param = firstFilter.Parameters.ToArray(); 
     foreach (var nextFilter in filters.Skip(1)) 
     { 
      var nextBody = Expression.Invoke(nextFilter, param); 
      body = Expression.OrElse(body, nextBody); 
     } 
     Expression<Func<T, bool>> result = Expression.Lambda<Func<T, bool>>(body, param); 
     return result; 
    } 

फिर, बाद में:

List<Expression<Func<Person, bool>>> filters = names 
    .Select<string, Expression<Func<Person, bool>>>(name => 
    p => p.Name == name 
).ToList(); 

Expression<Func<Person, bool>> filterOfOrs = filters.OrTheseFiltersTogether(); 

query = query.Where<Person>(filterOfOrs); 
+0

Invoke LINQ से Entities द्वारा समर्थित नहीं है :( – yonexbat

+0

@ user288281 यदि यह सच है - उदास। अभिव्यक्ति वृक्ष मैनिपुलेशन .net स्तर की सामग्री होनी चाहिए। पेड़ द्वारा संदर्भित लिंकक्टोस्क्ल या लिंकटोइन्टिटीज उदाहरण होने से पेड़ से संदर्भित होने की आपकी क्षमता को प्रभावित नहीं करना चाहिए यह अब चींटियों या तारों से होने के अलावा है। –

+0

क्या कोई इस नमूना को परिवर्तित करने के बारे में जानता है, इसलिए यह इकाई ढांचे के साथ काम करता है। कोई अभिव्यक्ति का आह्वान कैसे कर सकता है? यह किसी भी तरह से संभव है क्योंकि http://tomasp.net/blog है /linq-expand.aspx ढांचे। – yonexbat

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