动态生成Linq / Lambda Where子句

时间:2011-05-09 21:28:03

标签: c# linq dynamic lambda where-clause

我一直在这里和谷歌搜索,但我不知所措。我需要让用户使用表单在数据库中搜索报表。如果表单上的字段具有值,则应用程序将获得该字段设置为该值的任何报表。如果表单上的字段留空,则应用程序将忽略它。我怎样才能做到这一点?理想情况下,我只想将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子句。我想要一个简单的解决方案......在最坏的情况下,我会使用查询生成器的东西......但我宁愿避免这种情况(看起来很复杂)。

有什么建议吗? :)

3 个答案:

答案 0 :(得分:2)

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

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

.Take(N)不被视为获取记录 - 但在查询中添加(SELECT TOP N / LIMIT N)

答案 1 :(得分:1)

尝试查看几年前发布的dynamic Linq dll - 它仍然可以正常工作,看起来正是您正在寻找的。

答案 2 :(得分:1)

不,这不会运行查询,您可以通过这种方式构建查询,如果它有助于提高可读性,那么它实际上更为可取。在这种情况下,您正在利用惰性评估。

只有通过使用ie foreach枚举结果或强制评估查询结果,即使用.ToList()或强制评估,即评估单个结果时,查询才会运行使用ie First()Single()