gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:05:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com