2009-04-10 16 views
7

बनाने का सबसे अच्छा तरीका है हाय मैं डायनामिक LINQ क्वेरी लिखने के लिए सबसे अच्छी विधि ढूंढ रहा हूं।डायनामिक LINQ क्वेरी

मैं एक समारोह की तरह

public IQueryable<Student> FindByAllStudents(int? id, string Name, int? CourseID, bool? IsActive) // like this way, all field values are passed 
    {  
     // code for compairision 
     return db.Student; 
    } 

हम भी db.Students.where (विधेय) लिख सकते हैं

या

तरह

var students = from s in db.students where s.Name.Contains(Name) 
       s.ID.Equals(id) 
       //and so on.... 

तो यह होगा एक प्रश्न विधि काम करता है अगर मैं आईडी पास नहीं करता (यानी शून्य)? सभी डेटाटाइप के लिए उचित तरीका है?

बिंदु फ़ंक्शन में सभी विवरणों के चयन के बराबर के लिए पैरामीटर के रूप में सभी शून्य मान हो सकते हैं।

क्या कोई मुझे नमूना कोड के साथ सबसे अच्छी क्वेरी बनाने में मदद कर सकता है?

उत्तर

20

ठीक है, यह पूरी तरह से स्पष्ट आप क्या चाहते हैं नहीं है, लेकिन आप के लिए कोशिश कर रहे हैं केवल जोड़ने जहां मानकों जो गैर-शून्य कर रहे हैं के लिए खंड, तुम कर सकते हो:

public IQueryable<Student> FindByAllStudents 
    (int? id, string name, int? courseID, bool? isActive) 
{  
    IQueryable<Student> query = db.Student; 
    if (id != null) 
    { 
     query = query.Where(student => student.ID == id.Value); 
    } 
    if (name != null) 
    { 
     query = query.Where(student => student.Name.Contains(name)); 
    } 
    if (courseID != null) 
    { 
     query = query.Where(student => student.CourseID == courseID.Value); 
    } 
    if (isActive != null) 
    { 
     query = query.Where(student => student.IsActive == isActive.Value); 
    } 
    return query; 
} 

मैं प्रयास नहीं किया है कि, और यह संभव है कि LINQ से SQL को कोड द्वारा भ्रमित मूल्य प्रकार के मान को खोजने के लिए भ्रमित हो जाएगा। आप इस तरह कोड लिखने की आवश्यकता हो सकती है:

if (courseID != null) 
    { 
     int queryCourseID = courseID.Value; 
     query = query.Where(student => student.CourseID == queryCourseID); 
    } 

यह सरल रूप की कोशिश कर रहा लायक है पहले हालांकि :)

बेशक

, यह सब एक सा परेशान हो जाता है। एक सहायक विस्तार विधि जीवन अधिक संक्षिप्त कर सकता है:

public static IQueryable<TSource> OptionalWhere<TSource, TParameter> 
    (IQueryable<TSource> source, 
    TParameter? parameter, 
    Func<TParameter, Expression<Func<TSource,bool>>> whereClause) 
    where TParameter : struct 
{ 
    IQueryable<TSource> ret = source; 
    if (parameter != null) 
    { 
     ret = ret.Where(whereClause(parameter.Value)); 
    } 
    return ret; 
} 

फिर आप इसे इस तरह का उपयोग करेंगे:

public IQueryable<Student> FindByAllStudents 
    (int? id, string name, int? courseID, bool? isActive) 
{  
    IQueryable<Student> query = db.Student 
     .OptionalWhere(id, x => (student => student.ID == x)) 
     .OptionalWhere(courseID, x => (student => student.CourseID == x)) 
     .OptionalWhere(isActive, x => (student => student.IsActive == x)); 
    if (name != null) 
    { 
     query = query.Where(student => student.Name.Contains(name)); 
    } 
    return query; 
} 

इस तरह एक उच्च आदेश समारोह का उपयोग करना भ्रामक हो सकता है यदि आप वास्तव में सहज नहीं हैं हालांकि, इसके साथ, यदि आप इस तरह के कई प्रश्न नहीं कर रहे हैं तो आप लंबे लेकिन सरल कोड के साथ रहना चाहेंगे।

+0

धन्यवाद! पहले समाधान के लिए हम भी उपयोग कर सकते हैं अगर (id.HasValue) {id.Value} – Vikas

+0

का उपयोग करने से आप मुझे पूर्ण टेक्स्ट खोज का उपयोग करने के लिए मार्गदर्शन कर सकते हैं? – Vikas

+0

हैस्वालू का उपयोग करने के बराबर है! = शून्य। मुझे LINQ के साथ पूर्ण पाठ खोज का उपयोग करने के बारे में पता नहीं है, मुझे डर है। –