2012-04-25 1643 views
8

目前我取回我的結果如下:LINQ到SQL多條件where子句

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

但現在我想起來基於上面的列表視圖我的篩選器添加到8個有條件的where子句。

於是我變成了:

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

我該怎麼辦每個過濾器檢查,以添加一個where子句僅當它們包含的值?

+0

看看這裏的答案:http://stackoverflow.com/a/8841339/138938 – 2012-04-25 20:20:35

回答

32

沒有理由不能通過多次調用.Where來保持篩選結果。由於LINQ的延期執行到SQL它都將在一個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 2012-10-10 19:39:33

+0

+1 - 這真的是最靈活的方式 – 2013-10-09 20:53:20

0

你可以組一個或Null條件的每個濾鏡選項,連鎖它們放在一起用,像這樣:

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 == null,並且ClaimID的==「123」,它會只過濾claimId上的結果。你可以用空字符串替換每個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; 
}