2012-04-05 22 views
7

मेरे पास एक linq क्वेरी है। मेरे पास एक ऐसे फॉर्म से पैरामीटर का एक समूह है जहां मैं एकत्र करता हूं जहां मुझे फ़ील्ड के आधार पर फ़िल्टर करने की आवश्यकता होती है जिसे उपयोगकर्ता खोज रहा है।लिंक वैकल्पिक पैरामीटर

IQueyable<Users> user = from user in edmxObject.Users 
where user.FirstName.Contains(model.FirstName ?? user.FirstName) 
&& user.UserName.Contains(model.UserName ?? user.UserName) 

मेरे पास कुछ और गैर स्ट्रिंग फ़ील्ड फ़िल्टर हैं जिन्हें मुझे लंबे और बूलियन सहित फ़िल्टर करने की आवश्यकता है। यदि उपयोगकर्ता कुछ भी नहीं चुनता है तो वे शून्य हो सकते हैं। मैं उन्हें क्वेरी में कैसे शामिल करूं?

+0

यह सूची अज्ञात है? कुछ प्रकार के प्रश्न निर्माता की तरह? – Jodrell

+0

तो, 'मॉडल' वर्ग में कुछ मनमानी गुण हैं जो 'उपयोगकर्ता' इकाई के गुणों से मेल खाते हैं या रिश्ते मजबूत हैं? – Jodrell

उत्तर

16

यह सबसे अच्छा उदाहरण है कि LINQ इतना शक्तिशाली क्यों है - स्थगित निष्पादन। आप विभिन्न चरणों में क्वेरी का निर्माण कर सकते हैं, और केवल जब क्वेरी अंत में मार डाला या संकल्प लिया SQL विवरण उत्पन्न हो जाएगा है:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

यह डेटाकॉन्टेक्स्ट पर निर्भर करता है, लेकिन आपको 'var' का उपयोग करने के बजाय 'क्वेरी' को 'IQueryable <>' के रूप में परिभाषित करने की आवश्यकता हो सकती है। कुछ प्रदाताओं के पास यह एक वर्ग है जो 'IQueryable <>' लागू करता है। आप 'उपयोगकर्ता' के बाद 'AsQueryable()' पर भी काम कर सकते हैं। – Servy

+1

आप 'query = query का भी उपयोग कर सकते हैं। जहां (u => u.FirstName.Contains (model.FirstName)); 'अगर आपके कथन के अंदर है। आपके पसंदीदा वाक्यविन्यास पर निर्भर करता है। –

+0

@ सर्वी मैंने इसके लिए अपडेट किया है। अच्छा पकड़, धन्यवाद! – Yuck

5

क्वेरी एक विशेष क्षेत्र शामिल नहीं है, तो आप की जरूरत नहीं है

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

आप सशर्त घोंसला सुनिश्चित करने के लिए आप केवल स्थिति क्या तुम सच में की जरूरत है इस तरह से predicates कर सकते हैं: बिल्कुल जहां खंड के हिस्से के रूप में शामिल करने के लिए।

+0

धन्यवाद जिसने मदद की। – desiguy

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