2011-04-15 14 views
10

में स्थिति है मेरे पास एक परिदृश्य है जहां मुझे LINQ में एक गतिशील स्थिति का उपयोग करना होगा।गतिशील जहां LINQ

मैं कुछ इस तरह हैं:

public void test(bool flag) 
{ 
    from e in employee 
    where e.Field<string>("EmployeeName") == "Jhom" 
    If (flag == true) 
    { 
     e.Field<string>("EmployeeDepartment") == "IT" 
    } 
    select e.Field<string>("EmployeeID") 
} 

मैं जानता हूँ कि हम उपयोग नहीं कर सकते 'अगर' LINQ क्वेरी के बीच है, लेकिन इस के लिए समाधान क्या है में?

कृपया मदद ...

+0

यह वास्तव में * गतिशील * नहीं है, आपको केवल LINQ विधियों को स्पष्ट रूप से कॉल करने और उन्हें किसी शर्त के आधार पर श्रृंखलाबद्ध करने की आवश्यकता है। –

उत्तर

9

तो, अगर flag है false आप सभी Jhoms की जरूरत है, और अगर flag सच है आप आईटी विभाग

इस हालत में केवल Jhoms जरूरत

!flag || (e.Field<string>("EmployeeDepartment") == "IT" 

उस मानदंड को पूरा करता है (यह हमेशा सत्य है अगर झंडा झूठा है, आदि ..), तो क्वेरी हो जाएगा:

from e in employee  
where e.Field<string>("EmployeeName") == "Jhom" 
    && (!flag || (e.Field<string>("EmployeeDepartment") == "IT") 
select e.Field<string>("EmployeeID") 

भी, इस e.Field<string>("EmployeeID") व्यापार, softcoding की तरह बदबू आ रही है, कि में एक बार देख ले सकता है। मुझे लगता है कि

from e in employee  
where e.EmployeeName == "Jhom" 
    && (!flag || (e.EmployeeDepartment == "IT") 
select e.EmployeeID 

अधिक कॉम्पैक्ट और टाइपिंग त्रुटियों के लिए कम प्रवण होगा।


संपादित करें: यह उत्तर इस विशेष परिदृश्य के लिए काम करता है। यदि आपके पास इस तरह के कई प्रश्न हैं, तो हर तरह से अन्य उत्तरों में प्रस्तावित पैटर्न का निवेश करना।

+0

यह सबसे सीधे आगे है। –

10

कृपया बाहर पूर्ण ब्लॉग पोस्ट की जाँच करें: Dynamic query with Linq

पास दो विकल्प हैं आप का उपयोग कर सकते हैं:

Dynamic LINQ library

string condition = string.Empty; 
if (!string.IsNullOrEmpty(txtName.Text)) 
    condition = string.Format("Name.StartsWith(\"{0}\")", txtName.Text); 

EmployeeDataContext edb = new EmployeeDataContext(); 
if(condition != string.empty) 
{ 
    var emp = edb.Employees.Where(condition); 
///do the task you wnat 
} 
else 
{ 
//do the task you want 
} 

Predicate Builder

प्रिडिका ते बिल्डर गतिशील LINQ पुस्तकालय के लिए इसी तरह काम करता है, लेकिन यह सुरक्षित टाइप है: ऊपर पुस्तकालय के बीच

var predicate = PredicateBuilder.True<Employee>(); 

if(!string.IsNullOrEmpty(txtAddress.Text)) 
    predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text)); 

EmployeeDataContext edb= new EmployeeDataContext(); 
var emp = edb.Employees.Where(predicate); 

अंतर:

  • PredicateBuilder typesafe गतिशील प्रश्नों का निर्माण करने की अनुमति देता है।
  • डायनामिक LINQ लाइब्रेरी गतिशील कहां और ऑर्डर द्वारा क्लॉज का उपयोग करके निर्दिष्ट कॉल करने के लिए क्वेरी बनाने की अनुमति देता है।
+0

पहला उदाहरण संदर्भ से बाहर ले जाने लगता है। खालीपन के लिए 'स्थिति' की जांच करने का क्या मतलब है यदि इसे अभी 'string.Empty' असाइन किया गया है? मैं इसे अभी सही कर दूंगा .. –

+0

@gaearon - यदि वहां कोई और शर्त नहीं है जो यी है ... मैं पूरी पोस्ट के लिंक पोस्ट कर चुका हूं जहां आप विस्तार देख सकते हैं –

+0

@gaearon - उत्तर अब अपडेट किया गया है ... ...... अगर स्थिति –

2

आप श्रृंखला तरीकों कर सकते हैं:

public void test(bool flag) 
{ 
    var res = employee.Where(x => x.EmployeeName = "Jhom"); 

    if (flag) 
    { 
     res = res.Where(x => x.EmployeeDepartment == "IT") 
    } 

    var id = res.Select(x => x.EmployeeID); 
} 
+0

मुझे समझ में नहीं आता क्यों डाउनवोट? शायद एक स्पष्टीकरण मुझे मेरे जवाब में सुधार करने में मदद कर सकता है? – mathieu

+0

मेरा मानना ​​है कि यह नहीं पूछा जा रहा है। मुद्दा अज्ञात संपत्ति का नाम नहीं है लेकिन अज्ञात है (क्या मैं इसे कह सकता हूं) 'श्रृंखला'। आपका उत्तर यह नहीं दर्शाता है कि आप गतिशील LINQ के साथ चेन क्वेरी कैसे कर सकते हैं। इसके लिए, आपका उदाहरण गलत है क्योंकि 'कर्मचारी नाम' कर्मचारी की संपत्ति नहीं है, यह 'फ़ील्ड' विधि को पारित एक स्ट्रिंग है। –

+0

और, आखिरी लेकिन शायद डाउनवोट के लिए मुख्य कारण, मेरी व्यक्तिगत राय है कि यह एक बुरा विचार है। प्रश्न ** डायनेमिक LINQ ** के लिए कॉल नहीं करता है, जो आवश्यक है वह मनमाने ढंग से चेनिंग है, जो स्पष्ट LINQ विधि कॉल का उपयोग कर पहले से ही संभव है। डायनामिक और टाइप टाइपफ कोड केवल तभी पेश किया जाना चाहिए जहां टाइप सुरक्षा के साथ इसे हासिल करना मुश्किल हो (उदा। उपयोगकर्ता खोज बॉक्स में जटिल अभिव्यक्ति दर्ज कर रहा हो)। ** गतिशील LINQ पार्सिंग से बेहतर है लेकिन टाइपएफ़ क्वेरी से बहुत खराब है जो बहुत संभव है और इस प्रश्न के साथ भी वांछनीय है। ** –

0
from e in employee  
where e.Field<string>("EmployeeName") == "Jhom" && 
(!flag || e.Field<string>("EmployeeDepartment") == "IT") 
select e.Field<string>("EmployeeID") 
0

आप LINQ विधियों को स्पष्ट रूप से कॉल कर सकते हैं और उन्हें सशर्त रूप से श्रृंखलाबद्ध कर सकते हैं।

public IEnumerable<string> FilterEmployees (IEnumerable<Employee> source, bool restrictDepartment) 
{ 
    var query = source.Where (e => e.Field<string>("EmployeeName") == "Jhom"); 

    if (restrictDepartment) // btw, there's no need for "== true" 
     query = query.Where (e => e.Field<string>("EmployeeDepartment") == "IT"); 

    return query.Select (e => e.Field<string>("EmployeeID")); 
} 
संबंधित मुद्दे