2011-08-17 16 views
7

लिनक्स का उपयोग करके सशर्त क्वेरी करने का सबसे अच्छा तरीका क्या है (linq से sql नहीं)।ऑब्जेक्ट्स को लिंक करें बिल्डर

वर्तमान में मैं यहां http://www.albahari.com/nutshell/predicatebuilder.aspx पर पाए गए प्रिडिकेट बिल्डर का उपयोग कर रहा हूं और संकलित अनुमान को IENumerable में पास कर रहा हूं। जहां और यह अच्छी तरह से काम करता है। मैं क्या हल करना चाहते का

उदाहरण कोड:

जैसे मैं इस

string keyword1 = "Test1"; 
string keyword2 = "Test3"; 

     IEnumerable<TestObject> tests = new List<TestObject>() 
            { 
             new TestObject() {Name1 = "Test1", Name2 = "Test1"}, 
             new TestObject() {Name1 = "Test2", Name2 = "Test2"}, 
             new TestObject() {Name1 = "Test3", Name2 = "Test3"}, 

            }; 

     if (!String.IsNullOrEmpty(keyword1) && String.IsNullOrEmpty(keyword2)) 
      tests = tests.Where(e => e.Name1.Contains(keyword1)); 
     else if (!String.IsNullOrEmpty(keyword2) && !String.IsNullOrEmpty(keyword1)) 
      tests = tests.Where(e => e.Name2.Contains(keyword2) || e.Name1.Contains(keyword1)); 

     return tests.ToList(); 

उत्तर

14

है बस अभिव्यक्ति के पेड़ के बजाय प्रतिनिधियों का उपयोग करें और परिणाम का निर्माण करने के lambdas उपयोग करने के लिए PredicateBuilder बदलने के लिए:

public static class DelegatePredicateBuilder 
{ 
    public static Func<T, bool> True<T>() { return f => true; } 
    public static Func<T, bool> False<T>() { return f => false; } 

    public static Func<T, bool> Or<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) || expr2(t); 
    } 

    public static Func<T, bool> And<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) && expr2(t); 
    } 
} 
+1

यह धन्यवाद जॉन काम करता है, क्या कोई प्रदर्शन समस्याएं हैं जो इस तरह के प्रश्नों के निर्माण के कारण हो सकती हैं, जो इसे लंबे समय तक मैन्युअल रूप से कर रही हैं – kwiri

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