2012-04-25 39 views
8

Tại thời điểm này tôi lấy kết quả của tôi như sau:LINQ to SQL nhiều điều kiện nơi khoản

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

Nhưng bây giờ tôi đang cố gắng để thêm lên đến 8 nơi có điều kiện điều khoản dựa trên bộ lọc trên listview của tôi.

Vì vậy, tôi biến thành:

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(); 
} 

Làm thế nào tôi có thể làm một kiểm tra cho mỗi bộ lọc để thêm một mệnh đề where chỉ khi chúng có chứa một giá trị?

+0

Hãy xem câu trả lời ở đây: http://stackoverflow.com/a/8841339/138938 –

Trả lời

32

Không có lý do gì khiến bạn không thể tiếp tục lọc kết quả bằng cách gọi .Where nhiều lần. Bởi vì việc thực hiện chậm của LINQ to SQL nó tất cả sẽ được thực hiện trong bản Tuyên Bố một 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(); 
} 

Nếu bạn đã bao giờ sẽ cần phải thêm điều kiện OR, bạn có thể có một cái nhìn tại PredicateBuilder.

+0

Chỉ nghĩ rằng tôi muốn nói lời cảm ơn cho câu trả lời này. Điều này đã giúp tôi rất nhiều với một vấn đề tôi đã cố gắng giải quyết. – Grasshopper

+0

+1 cho PredicateBuilder - đó thực sự là cách linh hoạt nhất –

0

Bạn có thể nhóm mỗi tùy chọn bộ lọc với một điều kiện OR null, và chuỗi chúng lại với nhau với AND, như vậy:

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(); 

    } 

Vì vậy, nếu submissionId == null và claimID == "123", nó sẽ chỉ lọc kết quả trên claimId. Bạn có thể thay thế mỗi null bằng một chuỗi rỗng hoặc bất kỳ điều kiện "không có giá trị" nào của bạn.

0

Hãy xem LINQKIT http://www.albahari.com/nutshell/linqkit.aspx Nó sẽ cho phép bạn xây dựng vị

Dưới đây là một mã mà tôi sử dụng nhưng đọc tài liệu trên. Các vị ngữ sẽ cho phép bạn chuỗi lên một loạt các OR hoặc AND hoặc kết hợp của nó.

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; 
} 
Các vấn đề liên quan