我一直在这里和谷歌搜索,但我不知所措。我需要让用户使用表单在数据库中搜索报表。如果表单上的字段具有值,则应用程序将获得该字段设置为该值的任何报表。如果表单上的字段留空,则应用程序将忽略它。我怎样才能做到这一点?理想情况下,我只想将Where子句写为字符串,并将那些非空字符串加在一起。
.Where("Id=1")
我听说这应该有效,但我一直收到错误:“在当前的上下文范围内无法解决”确保所有引用的变量都在范围内......“。
另一种方法是拉出所有报告,然后一次过滤一个where子句。我对此犹豫不决是因为1.这是网络上的大量数据,而且在用户端进行了大量处理。我想利用服务器的处理能力。我听说在实际请求之前它不会查询。所以做这样的事情
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子句。我想要一个简单的解决方案......在最坏的情况下,我会使用查询生成器的东西......但我宁愿避免这种情况(看起来很复杂)。
有什么建议吗? :)
答案 0 :(得分:2)
Linq延迟记录提取,直到必须提取记录。 这意味着堆叠Where子句只是向查询添加AND / OR子句,但仍未执行。
生成的查询的执行将在您尝试获取记录(First,Any等),记录列表(ToList())或枚举它们(foreach)的精确时刻完成。
.Take(N)不被视为获取记录 - 但在查询中添加(SELECT TOP N / LIMIT N)
答案 1 :(得分:1)
尝试查看几年前发布的dynamic Linq dll - 它仍然可以正常工作,看起来正是您正在寻找的。 p>
答案 2 :(得分:1)
不,这不会运行查询,您可以通过这种方式构建查询,如果它有助于提高可读性,那么它实际上更为可取。在这种情况下,您正在利用惰性评估。
只有通过使用ie foreach
枚举结果或强制评估查询结果,即使用.ToList()
或强制评估,即评估单个结果时,查询才会运行使用ie First()
或Single()
。