c# - LINQ,查询的大过滤器

标签 c# asp.net-mvc linq

我正在构建一个应用程序的一部分,该应用程序围绕从数据库中提取有关交易的信息展开。由于数据的性质,我要筛选的表中有很多列。我有一个包含 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/

相关文章:

asp.net-mvc - 将 JSON.NET JObject 转换为 JsonResult 的异常

c# - 如何使用 Entity Framework 和 Asp.Net 为 CRUD 操作编写 Linq 查询?

c# - SortedDictionary 按键的相反顺序

c# - 如何在嵌套 ListView 中编辑数据

c# - 如何获取服务器端字段的字符串长度?

c# - 无法找到或加载程序集“tmpAssembly,

asp.net-mvc - 在 mvc4 中为 dropdownlistfor 选择的值

C# Excel 互操作 - 如何测试互操作对象是否仍在工作并执行任务?

c# - 当我创建集合时,Ninject inject 向集合中添加一个元素

c# - LINQ - IQueryable 优化 - 是否需要?