基于Entity FrameWork实现存储过程分页并返回总数

    很多项目都会用到分页这个功能。网上也有很多这方面的资料,包括存储过程也是。但是基于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:所有代码均经过本人实测,直接可用。是不是最优方案就不知道了。毕竟我还是菜鸡。。。大家共同学习进步!

转载于:https://www.cnblogs.com/GGLoner/p/6744161.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值