2012-06-16 6 views
6

मैंने IQueryable प्रकार पर एक एक्सटेंशन विधि बनाई है, जो इकाइयों का एक सबसेट लेता है और कुछ आलोचकों पर उन्हें फ़िल्टर करता है। मेरी समस्या यह है कि मैं वैरिएबल से बना संघ अभिव्यक्ति वापस नहीं कर सकता, बिना सभी को पहले शुरू किया जा रहा है। शून्य मान, aprears के रूप में मान्य नहीं हैं।यूनियन अभिव्यक्ति का उपयोग करने से पहले, IQueryable चर को कैसे प्रारंभ करना चाहिए?

public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors) 
    { 
     IQueryable<Person> q1 = null; 
     IQueryable<Person> q2 = null; 
     IQueryable<Person> q3 = null; 
     IQueryable<Person> q4 = null; 

     foreach (var value in hairColors) 
     { 
      switch (value) 
      { 
       case "1": 
        q1 = subQuery.Where(p => p.HairColor_bright == true); 
        break; 
       case "2": 
        q2 = subQuery.Where(p => p.HairColor_brown == true); 
        break; 
       case "3": 
        q3 = subQuery.Where(p => p.HairColor_dark == true); 
        break; 
       case "4": 
        q4 = subQuery.Where(p => p.HairColor_red == true); 
        break; 
      } 
     } 
     return q1.AsQueryable().Union(q2.AsQueryable()).Union(q3.AsQueryable()).Union(q4.AsQueryable()); 
    } 

प्रस्तुत कोड ब्लॉक कई और अधिक का हिस्सा है, और प्रत्येक डेटा का एक उप पैदा करता है, बाद में एक छानने विधि करने के लिए इस तरह से अवगत करा दिया:

results = persons.FilterGender(vm.gender).FilterAge(vm.age).FilterHeight(vm.height)...... 

उत्तर

3

संघ कॉल न करें जब में से एक तर्क शून्य है।

आपके लिए "शून्य-क्वेरी" का क्या अर्थ है? अगर इसका मतलब है "कोई पंक्ति नहीं" तो बस इसे संघ मत करो। यदि इसका मतलब है "सभी पंक्तियां" आपको संघ की आवश्यकता नहीं है क्योंकि आप केवल अंतर्निहित, unfiltered क्वेरी ले सकते हैं।

इस तरह

:

var result = new [] { q1, q2, q3, q4, }.Where(query => query != null).Aggregate(Queryable.Union); 

यह उपयोग कर रहा है LINQ करने वाली वस्तुओं एक LINQ करने वाली SQL क्वेरी के निर्माण के लिए।

एक नया संस्करण:

var result = dataContext.Persons.Where(_ => false); 
if(q1 != null) result = result.Union(q1); 
if(q2 != null) result = result.Union(q2); 
if(q3 != null) result = result.Union(q3); 
if(q4 != null) result = result.Union(q4); 

एसक्यूएल सर्वर क्वेरी अनुकूलक पहले डमी क्वेरी इतना है कि यह सभी में कोई क्रम लागत है निकाल देंगे।

+0

फिर मुझे शर्त कैसे यूनियन गैर नल चर के साथ प्रदर्शन करनी चाहिए? –

+0

मैंने एक प्रस्ताव जोड़ा। – usr

+0

धन्यवाद 'usr'। क्या आप मेरी समस्या तक पहुंचने के लिए अधिक सरल, सहज ज्ञान के बारे में सोच सकते हैं? –

1
public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors) 
{ 
    var result = new Person[] { }.AsQueryable(); 
    var contains = new Dictionary<string, Expression<Func<Person, bool>>>(); 

    contains.Add("1", p => p.HairColor_bright); 
    contains.Add("2", p => p.HairColor_brown); 
    contains.Add("3", p => p.HairColor_dark); 
    contains.Add("4", p => p.HairColor_red); 

    foreach (var color in hairColors) 
    { 
     result = subQuery.Where(contains[color]).Union(result); 
    } 

    return result; 
} 
+0

मैंने कोशिश की है, और यह इस त्रुटि के साथ आया: "यह विधि LINQ से इकाई आधारभूत संरचना का समर्थन करती है और इसका उद्देश्य सीधे आपके कोड से उपयोग नहीं करना है"। विषय regading देखें: http://social.msdn.microsoft.com/Forums/is/adodotnetentityframework/thread/3962b925-fe1e-4b96-ade3-5cb3b4be4511 –

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

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