Linq to SQL 多个条件 where 子句
Posted
技术标签:
【中文标题】Linq to SQL 多个条件 where 子句【英文标题】:Linq to SQL multiple conditional where clauses 【发布时间】:2012-05-06 13:47:24 【问题描述】:目前我正在检索我的结果如下:
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 子句?
【问题讨论】:
在这里看看答案:***.com/a/8841339/138938 【参考方案1】:您没有理由不能通过多次调用.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。
【讨论】:
只是想我会感谢这个答案。这对我试图解决的问题帮助很大。 +1 for PredicateBuilder - 这确实是最灵活的方式【参考方案2】:您可以使用 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();
因此,如果 submitId == null 和 claimId == "123",它只会过滤 claimId 上的结果。您可以将每个 null
替换为空字符串或任何您的“无价值”条件。
【讨论】:
【参考方案3】:看看 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;
【讨论】:
以上是关于Linq to SQL 多个条件 where 子句的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to SQL查询中的C#Dynamic WHERE子句