C# 动态生成Linq/Lambda Where子句

C# 动态生成Linq/Lambda Where子句,c#,linq,dynamic,lambda,where-clause,C#,Linq,Dynamic,Lambda,Where Clause,我一直在搜索这里和谷歌,但我不知所措。我需要让用户使用表单搜索数据库中的报告。如果表单上的某个字段有值,应用程序将获取该字段设置为该值的所有报告。如果表单上的某个字段留空,应用程序将忽略该字段。我该怎么做?理想情况下,我只想将Where子句写成字符串,并将非空的子句相加 。其中(“Id=1”) 我听说这应该是可行的,但我一直收到一个错误:“无法在当前上下文范围内解决。请确保所有引用的变量都在范围内…” 另一种方法是提取所有报告,然后一次过滤一个where子句。我很犹豫是否要这样做,因为1。这是一

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


有什么建议吗?:)

试着查看几年前发布的这个,它仍然可以正常工作,看起来正是您想要的。

不,这不会运行查询,您可以用这种方式构造查询,如果它有助于可读性,实际上更可取。在本例中,您正在利用惰性评估


仅当您使用foreach来枚举查询结果时,查询才会运行,即使用
foreach
或强制对查询结果进行求值,即使用
.ToList()
或其他方式强制求值,即使用
First()
single()对单个结果求值

Linq延迟记录获取,直到必须获取记录。 这意味着堆栈Where子句只是向查询中添加和/或子句,但仍然没有执行

生成的查询将在您尝试获取记录(首先,任何等)、记录列表(ToList())或枚举它们(foreach)的准确时刻执行


.Take(N)不被视为获取记录-而是向查询中添加一个(选择TOP N/限制N)

Awesome!非常感谢。我当然更喜欢添加where子句,它看起来更容易阅读/维护。:)我选择您的答案是因为您更清楚什么会触发查询执行。:)