可能大家对SQL语句太过熟悉了,也可能虽然已经从Asp过度到了Asp.Net时代,但是asp的观念没有发生太大变化。结果就是我们将应用程序大部分的逻辑都交给了数据库去完成,忘记了.Net Framework提供给我们灵活强大的数据操控能力。比如说,当我们需要对数据进行筛选的时候,我们想到的是“Where”子句,而不是List<T>.FindAll();当我们需要对数据进行排序的时候,我们想到的是“Order By”子句,而不是List<T>.Sort();当我们需要对数据进行分页的时候我们想到的是存储过程,而不是List<T>.GetRange()。
当然,让数据库去完成这些工作在很多情况下效率会很高,尤其是在数据量较大的时候。然而在数据量不大的情况下,一次将所有数据取出,然后缓存在服务器上,对于以后的排序、筛选、分页请求仅针对缓存进行,则会使效率提高很多。
没有哪种方法绝对好或者绝对不好,都有一个适用范围。本文将介绍的也是一样,当数据量非常大的时候,我们可能不仅希望数据库先用“Where”子句进行筛选,进而再一次筛选只返回当前页需要显示的数据条目。
本文仅仅提出同一个问题的另一种解决思路,何时使用根据情况而定。
对数据进行筛选应该是最常见不过的操作了,我们以NorthWind数据库的Orders订单表为例说明。如果我们需要对它按年、月、日的任意组合进行筛选,你大概会怎么做呢?我想应该是这样的:
可以看到,在上面的模式中,为了根据用户的选择显示不同的数据,每次用户的操作都要进行对数据库的一次访问,我们看一下具体的实现是怎样的。
首先,创建一个页面(SqlApproach.aspx),在页面上放置三个DropDownList控件,一个GridView控件,以及一个ObjectDataSource控件,如同下图所示:
在 App_Code 文件夹中根据Orders表创建业务对象Order(位于Order.cs)。
public class Order
{
private int orderId; // 订单Id
private string customerId; // 用户Id
private DateTime orderDate; // 下单日期
private string country; // 国家
public int OrderId {
get { return orderId; }
set { orderId = value; }
}
public string CustomerId
{
get { return customerId; }
set { customerId = value; }
}
public DateTime OrderDate
{
get { return orderDate; }
set { or