// 获取列表对象,使用 filter 作为筛选的条件
public static List<Order> GetList(List<Order> fullList, DateFilter<Order> filter)
{
List<Order> list = null;
if (fullList != null)
{
list = fullList.FindAll(new Predicate<Order>(filter.MatchRule));
}
return list;
}
在ObjFilter.aspx页面上布局与使用拼装SQL几乎没有区别,ObjectDataSource控件的属性有一些变化:
<asp:ObjectDataSource ID="objdsOrderList" runat="server" SelectMethod="GetList"
TypeName="OrderManager" OnSelecting="objdsOrderList_Selecting">
<SelectParameters>
<asp:Parameter Name="fullList" Type="Object" />
<asp:Parameter Name="filter" Type="Object" />
</SelectParameters>
</asp:ObjectDataSource>
调用了新的重载了的GetList()方法。然后我们看一下CodeBehind文件上如何进行设置ObjectDataSource的Selecting事件:
// 属性,获取用于筛选的对象
public DateFilter<Order> Filter {
get {
DateFilter<Order> filter = new OrderFilter(Year, Month, Day, Country);
return filter;
}
}
// 设置参数
protected void objdsOrderList_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["fullList"] = OrderManager.GetList();// 获取全部列表
e.InputParameters["filter"] = Filter;
}
注意上面Year、Month、Day属性的获取代码以及DropDownList的SelectedIndexChanged事件代码我都省略了以节省篇幅。
OK,现在我们的所有工作都已经完成了,我们来测试一下通过这种方式对数据库依赖的减小。大家可以打开Sql Server2000的事件探查器(Sql Server2005下的Sql Server Profiler)。选择“文件” --> “新建” --> “跟踪” --> 进行登录。之后应该如下图所示:
选择“事件”选项卡,之后如下图所示:
从右侧“选定的事件”中删除“存储过程”、“安全审查”、“会话”,只保留“T-SQL”,我们只对它进行监视。然后可以看到类似下图,我们对数据库的每次访问都可以在这里看到:
点击上面的“橡皮擦”图标,可以对列表进行清除。然后我们先打开SqlFilter.aspx文件,可以看到我们对列表的每次操作,不管是翻页还是筛选,都会对数据库进行一次查询操作。然后我们点击“橡皮擦”清除掉列表,然后打开ObjFilter.aspx文件,可以看到在对数据库进行了第一次访问以后,后继的动作,无论是进行分页还是筛选操作,都不再对数据库构成依赖。
在这篇文章中,我们主要讨论了如何对业务对象进行筛选。我先提出了很多人的一个思维定势:将操作交给数据库。随后列出了这种操作的典型流程,并在本文中将它称为“基于拼装SQL进行筛选”,然后给出了代码示范。
后半部分,我