用代码实现筛选
QueryExtender控件通过使用RangeExpression和SearchExpression使得定义筛选逻辑变得很容易。同样,可以使用CustomExpression或者MethodExpression控件去通过代码的方式去实现筛选逻辑。实际上,当需要应用筛选逻辑时,CustomExpression会触发一个事件,你可以在这个事件里编写相关的处理代码。而MethodExpression则有点不同,你要编写一个静态的方法,并传入一个类型为IQueryable的对象并且返回的对象也是要相同的类型。传入该方法的对象实际上是在筛选逻辑前的一个查询实例,可以在其中编写你需要实现的查询条件,最后要返回这个查询实例。
下面我们更详细去了解下MethodExpression。假设你要根据登陆了的用户的身份去筛选数据,比如管理员能看到所有产品信息但非管理员只能看到没打折的产品。则我们如上所述在静态方法中,传入IQueryable实例作为参数,返回的也对象类型也必须是IQueryable类型的,如下:
public static IQueryable FilterBasedOnUser(IQueryable query)
{
if (Roles.IsUserInRole("Administrators"))
// Return the query without filtering
return query;
else
// Return only non-discontinued products
return query.Where(p => p.Discontinued == false);
}
' VB
Public Shared Function FilterBasedOnUser(ByVal query As IQueryable(Of Product)) As IQueryable(Of product)
If Roles.IsUserInRole("Administrators") Then
' Return the query without filtering
Return query
Else
' Return only non-discontinued products
Return query.Where(Function(p) p.Discontinued = False)
End If
End Function
而在前端的代码中,则只需要使用MethodExpression指出引用的方法即可,如下所示:
<asp:QueryExtender ID="qeByMethod" runat="server" TargetControlID="dsProducts">
<asp:MethodExpression MethodName="FilterBasedOnUser" />
</asp:QueryExtender>
对返回的结果进行排序
除了筛选数据外,QueryExtender控件还可以对筛选出来的数据集指定排列的顺序。这可以通过OrderByExpression去实现,只需要设定哪些字段是需要排序的并指出其排序的方向即可。比如要对ProductName进行升序排序的话,只需要如下实现即可:
<asp:MethodExpression MethodName="FilterBasedOnUser" />
<asp:OrderByExpression DataField="ProductName" Direction="Ascending" />
</asp:QueryExtender>
你也可以设置零个或多个ThenBy的标签,以说明对列排序时的次序,比如下面的例子说明了在产品名称相同的情况下,将根据单价的升序去排列。
<asp:MethodExpression MethodName="FilterBasedOnUser" />
<asp:OrderByExpression DataField="ProductName" Direction="Ascending">
<asp:ThenBy DataField="UnitPrice" Direction="Descending" />
</asp:OrderByExpression>
</asp:QueryExtender>
总结
ASP.NET 4中新提供的控件QueryExtender,简化了对数据的筛选,甚至还可以指定筛选出来的数据的排序。其中RangeExpression允许开发者指定筛选数据的方式,而筛选的逻辑可以通过使用CustomExpression或MethodExpression去编写代码实现。