http://blogs.msdn.com/vbteam/archive/2007/08/29/implementing-dynamic-searching-using-linq.aspx
作者: Jonathan
在数据窗体应用程序中一个常见的需求是使用户能够按照由任意字段组合的动态查询搜索。例如,程序中的搜索功能允许用户查找所有满足在多个列上定义了不同规则的记录。
:
db.Orders _
try.Text _
_
dtpEndDate.Value
)来建立动态查询。
语句第一个部分看起来像这个样子:
))
))
New ParameterExpression() {p})
Yikes,这只是一小部分,我们目前只完成了1/3的Where语句!我可不想在写12行代码去来在运行时建立Where语句。我想做的是写一个CreateCondition 扩展方法,允许我用一行简单的代码建立表达式树(Expression Tree),像是这个样:
)
个条件:
startDate? = #1/1/1997#endDate? = #1/31/1997#
, Compare.GreaterThanOrEqual, startDate)
, Compare.LessThanOrEqual, endDate)
方法是泛型的并可以根据传入的参数推断类型。我们现在仅需要组合条件到一个条件中:
c = Condition.Combine(condition1, Compare.And, condition2, condition3)
)来完成这个(等价于上面的代码):
condition3
对象来过滤数据:
Dim filteredQuery = db.Orders.Where(c)
filteredQuery
In filteredQuery _
By row.OrderDate, row.OrderID _
Select row
DataGridView1
DataGridView1.DataSource = query
-
)通过构造这个,可以为一般版本参数推断带来好处,即我们不用担心传入的一般版本参数到方法,工厂方法将帮助我们解决。
-
)
-
)
'编译lambda 表达式成委托