Linq to SQL多条件where子句

目前我正在检索我的结果如下:

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

但是现在我想在listview上面添加基于filter的8个条件where子句。

所以我变成了:

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

如何检查每个filter以仅在包含值时添加where子句?

你没有理由不能通过多次调用来过滤结果。 由于LINQ to SQL的延迟执行,它将全部在一个SQL语句中执行:

 public List GetFilteredClaims(string submissionId, string claimId, string organization, string status, string filterFromDate, string filterToDate, string region, string approver) { IQueryable 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(); } 

如果您需要添加OR条件,可以查看PredicateBuilder 。

您可以将每个filter选项分组为OR null条件,并将它们与AND一起链接,如下所示:

 public List 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值。

看看LINQKIT http://www.albahari.com/nutshell/linqkit.aspx它将允许你构建谓词

这是我使用的代码,但请阅读上面的文档。 谓词将允许您链接一堆OR或AND或它的组合。

 private static IEnumerable filterData(string firstName, string lastName, List results) { var predicate = PredicateBuilder.True(); IEnumerable 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; }