zoukankan      html  css  js  c++  java
  • 基于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:所有代码均经过本人实测,直接可用。是不是最优方案就不知道了。毕竟我还是菜鸡。。。大家共同学习进步!

  • 相关阅读:
    Java知识系统回顾整理01基础05控制流程02 switch
    Java知识系统回顾整理01基础05控制流程01if
    Java知识系统回顾整理01基础04操作符07Scanner
    Java知识系统回顾整理01基础04操作符06三元运算符
    Java知识系统回顾整理01基础04操作符05赋值操作符
    Java知识系统回顾整理01基础04操作符04位操作符
    Java知识系统回顾整理01基础04操作符03逻辑运算符
    leetcode-----74. 搜索二维矩阵
    leetcode-----73. 矩阵置零
    leetcode-----72. 编辑距离
  • 原文地址:https://www.cnblogs.com/GGLoner/p/6744161.html
Copyright © 2011-2022 走看看