我一直在这里和谷歌上搜索,但我不知所措。我需要让用户使用表单在数据库中搜索报告。如果表单上的某个字段具有值,则应用程序将获取该字段设置为该值的任何报告。如果表单上的字段留空,应用程序将忽略它。我怎样才能做到这一点?理想情况下,我只想将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/