[英]Linq to SQL multiple conditional where clauses
目前,我正在检索以下结果:
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子句?
没有理由不能仅通过多次调用.Where
继续过滤结果。 由于LINQ to 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();
}
如果您需要添加OR条件,则可以查看PredicateBuilder 。
您可以使用OR空条件将每个过滤器选项分组,然后将它们与AND链接在一起,如下所示:
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();
}
因此,如果submittionId == null并且claimId ==“ 123”,它将仅过滤根据claimId的结果。 您可以用空字符串或任何“无值”条件替换每个null
。
看看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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.