2012-04-25 16 views
8

फिलहाल मैं इस प्रकार अपने परिणामों को पुन: प्राप्त कर रहा हूँ:LINQ एसक्यूएल एकाधिक सशर्त करने के लिए जहां खंड

public List<claim> GetClaims() 
{ 
    return _db.claims.OrderBy(cl => cl.claimId).ToList(); 
} 

लेकिन अब मैं अपने सूचीदृश्य ऊपर फ़िल्टर पर आधारित 8 सशर्त जहां खंड को जोड़ने के लिए कोशिश कर रहा हूँ।

तो मैं में बदल गया: एक जहां खंड जोड़ने के लिए प्रत्येक फिल्टर का एक चेक

public List<claim> GetFilteredClaims(string submissionId, string claimId, 
            string organization, string status, 
            string filterFromDate, string filterToDate, 
            string region, string approver) 
{ 
    return _db.claims.Where(cl => cl.submissionId == 5).ToList(); 
} 

मैं कैसे कर सकता केवल अगर वे एक मान?

+0

यहाँ जवाब पर एक नज़र डालें: http://stackoverflow.com/a/8841339/138938 –

उत्तर

32

कोई कारण नहीं है कि आप कई बार .Where पर कॉल करके परिणामों को फ़िल्टर नहीं कर सकते हैं। LINQ की आस्थगित निष्पादन की वजह से SQL करने के लिए यह सब एक एसक्यूएल बयान में निष्पादित किया जाएगा:

public List<claim> GetFilteredClaims(string submissionId, string claimId, 
            string organization, string status, 
            string filterFromDate, string filterToDate, 
            string region, string approver) 
{ 
    IQueryable<claim> filteredClaims = _db.claims; 

    if (!string.IsNullOrWhiteSpace(submissionId)) 
    { 
     filteredClaims = filteredClaims.Where(claim => claim.submissionId == submissionId); 
    } 

    if (!string.IsNullOrWhiteSpace(claimId)) 
    { 
     filteredClaims = filteredClaims.Where(claim => claim.claimId == claimId); 
    } 

    ... 

    return filteredClaims.ToList(); 
} 

क्या तुमने कभी जोड़ सकते हैं या स्थितियों की आवश्यकता होगी, तो आप PredicateBuilder पर एक नज़र ले सकता है।

+0

बस सोचा था कि मैं इस उत्तर के लिए धन्यवाद कहना चाहते हैं। इसने मुझे हल करने की कोशिश कर रहे एक समस्या के साथ बहुत मदद की। PredicateBuilder के लिए – Grasshopper

+0

+1 - यह वास्तव में सबसे लचीला तरीका है –

0

आप समूह एक या अशक्त शर्त के साथ प्रत्येक फिल्टर विकल्प कर सकते थे, और उन सब के साथ एक साथ श्रृंखला और, इसलिए जैसे:

public List<claim> GetFilteredClaims(string submissionId, string claimId, string organization, string status, string filterFromDate, string filterToDate, string region, string approver) 
    { 
     return _db.claims 
      .Where(cl => (cl.submissionId == submissionId || submissionId == null) 
      && (cl.claimId == claimId || claimId == null) 
      && so on and so on...).ToList(); 

    } 

तो अगर submissionId == बातिल और ClaimID == "123", यह होगा केवल दावा आईडी पर परिणाम फ़िल्टर करें। आप एक खाली स्ट्रिंग के साथ प्रत्येक null को प्रतिस्थापित कर सकते हैं या जो भी आपकी "कोई मान" स्थिति नहीं है।

0

LINQKIT http://www.albahari.com/nutshell/linqkit.aspx पर एक नजर डालें यह आप विधेय

यहाँ का निर्माण करने की अनुमति देगा एक कोड है कि मैं का उपयोग करें, लेकिन इसके बाद के संस्करण दस्तावेज़ पढ़ें है। भविष्यवाणी आपको OR या AND या उसके संयोजन का समूह बनाने की अनुमति देगी।

private static IEnumerable<SurveyResult> filterData(string firstName, string lastName, List<SurveyResult> results) 
{ 
    var predicate = PredicateBuilder.True<SurveyResult>(); 


    IEnumerable<SurveyResult> a; 
    if (excludeBadData) 

    if (firstName != string.Empty) 
    { 
     predicate = predicate.And(p => p.User.FirstName.ToLower().Contains(firstName.ToLower())); 
    } 

    if (lastName != string.Empty) 
    { 
     predicate = predicate.And(p => p.User.LastName.ToLower().Contains(lastName.ToLower())); 
    } 


    a = from r in results.AsQueryable().Where(predicate) select r; 
    return a; 
} 
संबंधित मुद्दे