2011-05-09 82 views
2

我一直在这里搜索和谷歌,但我很茫然。我需要让用户使用表单搜索数据库中的报告。如果表单上的某个字段具有值,则该应用将获得该字段设置为该值的任何报告。如果表单上的某个字段留空,则应用会忽略它。我怎样才能做到这一点?理想情况下,我想只将Where子句作为字符串来编写,并将那些不是空的。动态生成Linq/Lambda条款

.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子句。我想要一个简单的解决方案...在最坏的情况下,我会使用查询生成器的东西......但我宁愿避免(似乎很复杂)。

有什么建议吗? :)

+0

http://stackoverflow.com/questions/848415/linq-dynamic-where-条款 – Greg 2011-05-09 21:40:32

回答

1

不,这不会运行查询,您可以用这种方式来构建您的查询,并且它实际上最好是它有助于可读性。在这种情况下,您正在利用懒惰评估。

如果枚举从它的结果通过使用即foreach或强行将查询结果的渴望评价,即用.ToList()或以其他方式强制评估,即评估使用即First()Single()一个结果查询将只运行。

+0

太棒了!谢谢。我绝对喜欢只添加where子句,看起来更容易阅读/维护。 :)我选择了你的答案,因为你更清楚会触发查询执行的内容。 :) – LindsayFester 2011-05-09 21:45:36

2

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

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

。取(N)不被认为是读取记录 - 但添加(SELECT TOP N/LIMIT N)到查询