我们现在可以开始设置QueryExtender的筛选逻辑了。QueryExtender的筛选逻辑使用的是一个或多个表达式。ASP.NET提供了如下表达式,包括:
• RangeExpression – 获得小于,等于或者大于指定值的数据集合
• SearchExpression –根据给出的字符串去进行搜索
• ControlFilterExpression – 根据指定的控件的值去搜索筛选,比如根据TextBox或者DropDownList
• CustomExpression 和 MethodExpression - 这两个表达式基本基本是一样的,它允许开发者去编写自己的筛选逻辑。
• OrderByExpression – 根据开发者的指定,去排序列和根据指定的方向去排序
比如,去显示单价小于10美元的产品,我们可以增加一个RangeExpression,如下:
<asp:RangeExpression DataField="UnitPrice" MinType="Inclusive" MaxType="Exclusive">
<asp:Parameter DefaultValue="0" />
<asp:Parameter DefaultValue="10" />
</asp:RangeExpression>
</asp:QueryExtender>
在上面的例子中,请注意其中的inclusive和exclusive属性。因为我们想看到的是大于或者等于0美元,但小于10美元的,所以我们对最小值设置的是inclusive包含的属性,对最大值设置的是exclusive不包含的属性。
注意,RangeExpression能够包含所有能在SqlDataSource, LinqDataSource和EntityDataSource控件中使用的参数控件,包括:
• Parameter 控件,用来筛选硬编码的值
• SessionParameter 控件,根据session的值去筛选
• ControlParameter 控件,根据指定控件的值去筛选
例如,要根据用户在文本框输入的值去筛选,我们只需要替换RangeExpression中的第2个参数为ControlParameter,即可:
<asp:RangeExpression DataField="UnitPrice" MinType="Inclusive" MaxType="Exclusive">
<asp:Parameter DefaultValue="0" />
<asp:ControlParameter ControlID="TextBoxID" DefaultValue="0" />
</asp:RangeExpression>
</asp:QueryExtender>
更详细的可以参考本文附录代码中的FilterDemo.aspx文件。
实际上,如果你懂得SQL,就应该知道,QueryExtender控件实际上是在后端为你生成了象如下这样的代码,以上文讲到的例子为例:
FROM Products
WHERE UnitPrice >= 0 AND UnitPrice < 10
使用SearchExpression根据字符串去筛选
QueryExtender控件和SearchExpression使到很容易数据库中根据字符串去筛选数据。SearchExpression允许你指定在一列或多列中去筛选符合指定字符串的数据,可以指定筛选出以某个字符串开头,结尾或者包含的数据集合。下图显示了用户可以在搜索框中输入字符串,页面会显示出产品名称,目录或供应商的名称中以该字符串开头的所有数据。比如在搜索框中输入字符a,则返回的结果中,象Acme Tea,Acme Water,Alice Mutton和Aniseed Syrup都显示出来,而Charteuse verte也显示出来,因为它的供应商Aux joyeux ecclésiastiques,也是以a开头的。

这个例子也是很简单,除了使用gridview和EntityDataSource控件外,指定了SearchExpression去获得产品名称,目录名和供应商名,指定了搜索模式是StartsWith,即以字母开头的方式,并指定了根据文本框输入的内容去筛选。代码如下:
<asp:SearchExpression DataFields="ProductName, Category.CategoryName, Supplier.CompanyName" SearchType="StartsWith">
<asp:ControlParameter ControlID="txtFilterText" />
</asp:SearchExpression>
</asp:QueryExtender>
具体的可以参考本文附送代码中的Search.aspx文件
如果你想筛选出符合者三个条件的所有记录,则可以指定三个SearchExpression即可如下所示:
<asp:SearchExpression DataFields="ProductName" SearchType="StartsWith">
<asp:ControlParameter ControlID="txtFilterText" />
</asp:SearchExpression>
<asp:SearchExpression DataFields="Category.CategoryName" SearchType="StartsWith">
<asp:ControlParameter ControlID="txtFilterText" />
</asp:SearchExpression>
<asp:SearchExpression DataFields="Supplier.CompanyName" SearchType="StartsWith">
<asp:ControlParameter ControlID="txtFilterText" />
</asp:SearchExpression>
</asp:QueryExtender>
这样,指定了三个SearchExpression表达式,它们的逻辑关系是AND。