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

  • 相关阅读:
    斗鱼的sidebar的实现简陋的demo
    angular JS中使用jquery datatable添加checkbox点击事件
    angular JS中使用jquery datatable添加ng-click事件
    Redis 中文文档
    操作word的
    Redis作为消息队列服务场景应用案例(入队和出队)
    nopcommerce 商城案例
    net 将手机号码中间的数字替换成星号
    V5客服
    EF 数据库迁移(Migration)
  • 原文地址:https://www.cnblogs.com/GGLoner/p/6744161.html
Copyright © 2020-2023  润新知