我正在构建一个应用程序的一部分,该应用程序围绕从数据库中提取有关交易的信息展开。由于数据的性质,我要筛选的表中有很多列。我有一个包含 15 个字段的过滤器选择框,我希望能够为 LINQ 语句构建一个 where 子句。当我希望某些字段为空时,有趣的部分就来了。例如,我希望能够过滤任何或所有:
- 交易类型
- 响应代码
- 交易金额
- 还有很多
我可以建立一个像这样的谓词
Func<Transaction, bool> pred = t => t.ResponseCode == ResponseCode && t.TransactionType == TransactionType && t.TransactionAmount > 100.00;
但是为了能够选择要包含在谓词中的字段,我是 concatenating the predicates一起:
Func<Transaction, bool> pred = t => true;
if(ResponseCode != null)
pred.AndAlso(t => t.ResponseCode == ResponseCode);
// Rinse and repeat
然后将该谓词传递给 LINQ 语句的 where 子句。
这完全符合我的要求,但是相当复杂。还有其他方法吗?
更新: 感谢正义的评论。我没有使用 LINQ to SQL,而是在存储库中的对象集合上使用 LINQ。您将如何以编程方式构建表达式过滤器?
最佳答案
- 在动态 SQL 中...因为您只有一个 WHERE 子句 - 您必须使用 AND 连接谓词。
- 在 linq 查询构造中...您可以得到任意多的 WHERE 子句。在翻译查询时,Linq 会为您将它们与它们组合在一起。
例子:
IQueryable<Transaction> query = db.Transactions;
if (filterByTransactionType)
{
query = query.Where(t => t.TransactionType == theTransactionType);
}
if (filterByResponseCode)
{
query = query.Where(t => t.ResponseCode == theResponseCode);
}
if (filterByAmount)
{
query = query.Where(t => t.TransactionAmount > theAmount);
}
另一个例子:
List<Expression<Func<Transaction, bool>>> filters = GetFilterExpressions();
IQueryable<Transaction> query = db.Transactions;
filters.ForEach(f => query = query.Where(f));
关于c# - LINQ,查询的大过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/492698/