Hxj.Data 数据库组件文档 下载本文

数据库组件 Hxj.Data (二十) (分页)

分页在前面好几节中的列子中已经出现,现在再详细讲解一下。 有三种方法去实现: 1、Top(int topCount) 方法

在sqlserver和msaccess中其实就是top , 在oracle通过rownum实现。 2、From(int startIndex, int endIndex) 从startIndex条到endIndex条之间的记录数。 3、Page(int pageSize, int pageIndex) 每页pageSize条,第pageIndex页 下面就依次对这三个方法举例说明。 top方法:

DbSession.Default.From() .Top(10) .ToList();

该查询时查询products表中的前10条记录,生成的sql语句如下:(如何输出查看组件生成的sql)

Text:

SELECT TOP 10 * FROM [Products]

from方法:

DbSession.Default.From() .From(3, 8) .ToList();

查找第3条到第8条的数据(包括第3条和第8条),生成的sql语句如下:

Text:

SELECT * FROM

( SELECT TOP 6 * FROM

( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC

page方法:

41

DbSession.Default.From() .Page(10, 2) .ToList();

查询每页10条的第2页数据,sql语句如下:

Text:

SELECT * FROM

( SELECT TOP 10 * FROM

( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC

可以看出from方法和page方法生成的sql语句是格式是一样的,其实page方法最终还是调用from方法,

如果from的startIndex参数等于1就会调用top方法来查询。 默认情况下我们并没有设置排序,组件则会自动添加一个排序,如果有主键则选主键排序,不然选一个其他列排序。

当然在很多情况下我们是需要设置哪些列排序的。 例如:

DbSession.Default.From() .Page(10, 2)

.OrderBy(Products._.UnitPrice.Desc) .Where(Products._.CategoryID == 2) .ToList();

查询条件是categoryid等于2,按照unitprice倒叙排序,每页10条的第2页数据。

生成的sql如下:

Text:

SELECT * FROM

( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC

Parameters:

@bee7551993404c8592f07f9b01710bb5[Int32] = 2

这样的sql语句是不是出乎意料啊,原来符合条件的查询第二页只有2条数据,所以查询的时候就直接unitprice正序top 2就完结了。 我们把条件去掉再看看:

DbSession.Default.From() .Page(10, 2)

.OrderBy(Products._.UnitPrice.Desc) //.Where(Products._.CategoryID == 2) .ToList(); 生成的sql如下:

Text:

SELECT * FROM

42

( SELECT TOP 10 * FROM

( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC

这样算是正常的生成格式了。

以上的sql脚本都是在sql server2000下生成的。

其实在查询过程中组建还会自动查询了count()符合条件的记录数,所以在大数据的情况下,效率不会很好。

如果你设置组建的数据库是sql server2005则不会去查询 count,而是直接通过row_number()来查询,来获得更好的效率。(oracle则是rownum实现) 下面来sql server2005例子:

DbSession.Default.From() .Page(10, 2)

.OrderBy(Products._.UnitPrice.Desc) //.Where(Products._.CategoryID == 2) .ToList();

代码还是上面的例子的,生成的sql:

Text:

SELECT * FROM

( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table

WHERE (tmp__rowid BETWEEN 11 AND 20)

方法的调用还是一样的,所以如果from的参数startIndex等于1,还是优先使用top,并没有使用row_numer()。

当然你觉得分页还不够理想,可以自己写sql或者存储过程。

数据库组件 Hxj.Data (二十一) (ToScalar

经过周末的通宵,发布了组件1.0版本。

对组件进行了扩展,最大的修改就是增加缓存查询,以获得更好的性能。 本节先讲一些小的扩展修改。

之前版本ToScalar()只是返回object。

现在增加了ToScalar()方法,组件自动转换类型。 例如:

DbSession.Default.From().Select(Products._.ProductID).Top(1).ToScalar();

43

这样就返回类型为int类型,免去转换的代码。

当查询出来的值为null 或者DbNull ,该转换则返回default(TResult) 。 随之扩展了DbSession的方法:

Sum(Field field, WhereClip where) Max(Field field, WhereClip where) Min(Field field, WhereClip where) Avg(Field field, WhereClip where) 返回需要的类型。 例如:

DbSession.Default.Avg(Products._.UnitPrice, WhereClip.All);

这样返回回来的就是decimal 类型的数据。

DbSession还增加了Exists(WhereClip where) 判断是否存在记录,返回bool。 下一节将讲述缓存查询。

数据库组件 Hxj.Data (二十二) (缓存)

首先我是做web开发的,所以很多会偏向web的,组件使用的缓存是System.Web.HttpRuntime.Cache。 组件在默认情况下是关闭缓存的。 所以要开启缓存查询要做一下配置。 先看一下例子配置:

44