标签:好的 arch type 学习 dexp 页码 int 方便 sum
很多项目都会用到分页这个功能。网上也有很多这方面的资料,包括存储过程也是。但是基于EF来存储过程并返回总条数或者总页数的资料就没那么齐全了,至少我找了很久也没有找到。没有办法,项目有需求,那就自己一点点研究咯。好在皇天不负有心人,总算是弄出来了。这里写出来,方便你我他。
先上存储过程的代码:
ALTER PROC [dbo].[Common_PageList]
(
@tab nvarchar(max),---表名
@strFld nvarchar(max), --字段字符串
@strWhere varchar(max), --where条件
@PageIndex int, --页码
@PageSize int, --每页容纳的记录数
@Sort VARCHAR(255), --排序字段及规则,不用加order by
@AllCount int out --总条数
)
AS
declare @strSql nvarchar(max)
declare @strSqlCount nvarchar(max)
begin
SET NOCOUNT ON;
--分页查询
set @strSql=‘ SELECT * FROM (SELECT ROW_NUMBER()
OVER(ORDER BY ‘ + @Sort + ‘) AS rownum, ‘ + @strFld + ‘ FROM ‘ + @tab + ‘ where ‘ + @strWhere + ‘) AS Dwhere
WHERE rownum BETWEEN ‘ + CAST(((@PageIndex-1)*@PageSize + 1) as nvarchar(20)) + ‘ and ‘ + cast((@PageIndex*@PageSize) as nvarchar(20))
--总数查询
set @strSqlCount=‘select @total=count(*) from ‘+@tab + ‘ where ‘ + @strWhere
--执行总数查询,返回总数
exec sp_executesql @strSqlCount,N‘@total int out‘,@total=@AllCount out
--执行分页查询
exec (@strSql)
end
这里偷个懒,就没有新建存储过程,而是把已经创建好的直接贴了出来。当然效果是一毛一样的。
这是一个通用的存储过程分页,满足你的各种姿势。难点就在于这句exec sp_executesql @strSqlCount,N‘@total int out‘,@total=@AllCount out;返回总数或者总页数所要用到。当然我只是说对于我来说是难点,毕竟返回这块儿让我绞尽脑汁。高手勿喷。
封装好的C#代码:
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strTabName">表名</param>
/// <param name="strField">查询字段</param>
/// <param name="strWhere">查询条件</param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页条数</param>
/// <param name="strSort">排序</param>
/// <param name="total">总数</param>
/// <returns></returns>
private List<T> ProcPageAndSort<T>(string strTabName, string strField, string strWhere, int pageIndex, int pageSize, string strSort, out int total)
{
List<SqlParameter> paraArray = new List<SqlParameter>();
paraArray.Add(new SqlParameter("@tab", strTabName));
paraArray.Add(new SqlParameter("@strFld", strField));
paraArray.Add(new SqlParameter("@strWhere", strWhere));
paraArray.Add(new SqlParameter("@PageIndex", pageIndex));
paraArray.Add(new SqlParameter("@PageSize", pageSize));
paraArray.Add(new SqlParameter("@Sort", strSort));
//传出参数
SqlParameter param = new SqlParameter
{
ParameterName = "@AllCount",
Value = 0,
Direction = ParameterDirection.Output
};
paraArray.Add(param);
//调用存储过程
List<T> sysAuths = ekpEntities.Database.SqlQuery<T>(
"Common_PageList @tab, @strFld, @strWhere, @PageIndex, @PageSize, @Sort, @AllCount out",
paraArray.ToArray()).ToList();
total = (int)param.Value; //得到存储过程返回值
return sysAuths;
}
不消多说,就是调用存储过程的代码,参数与存储过程定义的参数基本一致。一次封装,到处可用。。。(怎么有点java的理念。。。);
调用示例:
/// <summary>
/// 调用存储过程分页查询
/// </summary>
/// <param name="bName"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="sortField"></param>
/// <param name="sortOrder"></param>
/// <param name="total"></param>
/// <returns></returns>
public List<EKP_SYSTEMAUTHORITY> GetClientMenuByProc(string bName, int pageIndex, int pageSize, string sortField, string sortOrder, out int total)
{
sortField = sortField == "" ? "Bid" : sortField;
string strTabNameP = "EKP_SYSTEMAUTHORITY";
string strFieldP = "*";
string strWhereP = " BName like ‘%" + bName + "%‘ ";
int pageIndexP = pageIndex + 1;
int pageSizeP = pageSize;
string strSortP = sortField + ‘ ‘ + sortOrder;
List<EKP_SYSTEMAUTHORITY> sysAuths = ProcPageAndSort<EKP_SYSTEMAUTHORITY>
(strTabNameP, strFieldP, strWhereP, pageIndexP, pageSizeP, strSortP, out total);
return sysAuths;
}
费劲巴拉的创建好存储过程,封装好分页方法。当然是享受胜利果实的时候,只需要按照封装的方法定义好需要传递的参数。瞬间搞定。。。很酸爽!
PS:所有代码均经过本人实测,直接可用。是不是最优方案就不知道了。毕竟我还是菜鸡。。。大家共同学习进步!
基于Entity FrameWork实现存储过程分页并返回总数
标签:好的 arch type 学习 dexp 页码 int 方便 sum
原文地址:http://www.cnblogs.com/GGLoner/p/6744161.html