c# - 动态生成 Linq/Lambda Where 子句

标签 c# linq dynamic lambda where-clause

我一直在这里和谷歌上搜索,但我不知所措。我需要让用户使用表单在数据库中搜索报告。如果表单上的某个字段具有值,则应用程序将获取该字段设置为该值的任何报告。如果表单上的字段留空,应用程序将忽略它。我怎样才能做到这一点?理想情况下,我只想将Where子句编写为字符串并将那些不为空的子句添加在一起。

.Where("Id=1")

我听说这应该有效,但我不断收到错误:“无法在当前上下文范围内解析,请确保所有引用的变量都在范围内...”。

另一种方法是提取所有报告,然后一次过滤一个 where 子句。我对此犹豫不决,因为 1. 这是网络上的大量数据,2. 用户端需要进行大量处理。我想利用服务器的处理能力。我听说在实际请求之前它不会查询。所以做这样的事情

    var qry = ctx.Reports
          .Select(r => r);

在我这样做之前不会真正运行查询:

    qry.First()

但是如果我开始这样做:

    qry = qry.Where(r => r.Id = 1).Select(r => r);
    qry = qry.Where(r => r.reportDate = '2010/02/02').Select(r => r);

这会运行查询吗?因为我要为其添加一个 where 子句。我想要一个简单的解决方案...在最坏的情况下我会使用查询生成器...但我宁愿避免这种情况(看起来很复杂)。

有什么建议吗? :)

最佳答案

Linq 会延迟记录获取,直到必须获取记录为止。 这意味着堆叠Where子句只是向查询添加AND/OR子句,但仍然不执行。

生成的查询的执行将在您尝试获取记录(First、Any 等)、记录列表(ToList())或枚举它们(foreach)的精确时刻完成。

.Take(N) 不被视为获取记录 - 而是向查询添加 (SELECT TOP N/LIMIT N)

关于c# - 动态生成 Linq/Lambda Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942708/

相关文章:

c# - 动态 GridView 生成

c# - 使用 LINQ to XML 时如何检查 XML 是否包含元素?

c# - Linq 和 Dictionary 以及转换数组值

c# - 带更新查询的 Linq

javascript - 在javascript中设置动态变量名

javascript - 通知 : closable "false" not working?

c# - 在 Swagger UI 中指示复杂输入参数对象的必需属性

c# - 如何计算三个数之间的最大公约数

c# - 停止产生线程

c# - 简单的 C# foreach to LINQ 问题