mvc,EntityFramework调用分页存储过程
2017-05-08 11:36
351 查看
此文讲述mvc4+entityframework6+sqlserver2008环境下调用存储过程,实现分页。
1、分页存储过程代码如下:
分页原理用的row_number()和over()函数实现(没有用top、not in,因为性能低;sqlserver2012有新特性,用offset、fetch实现)。
这里支持多表查询分页。
分页实现类
3、调用并返回数据:
上面的new PageinationImplement(db)中的db是数据库上下文(DbContext实例),
上面的data里包括了分页列表,总记录数,分页页数 信息。
注:本来我执行存储过程,想只查询表的部分字段,结果会报错,暂时只能用*查询所有字段,
网上查说EF暂时仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...
我能想到的方法就是自定义类,不用对应数据库的实体类。
不知道有没有其他方法可以实现,各位大神如果有方法的话,希望指教一下,谢谢!
1、分页存储过程代码如下:
分页原理用的row_number()和over()函数实现(没有用top、not in,因为性能低;sqlserver2012有新特性,用offset、fetch实现)。
这里支持多表查询分页。
namespace WebUI.PageinationService { /// <summary> /// 分页读取数据的实现类 /// </summary> public class PageinationImplement { //数据库上下文实例 private MyDbContext db; public PageinationImplement(MyDbContext dbContext) { this.db = dbContext; } /// <summary> /// 读取分页数据 /// </summary> /// <typeparam name="T">实体</typeparam> /// <param name="pageinationInfo">分页信息类</param> /// <returns>分页数据</returns> public PageinationData GetPageinationData<T>(PageinationInfo pageinationInfo) where T : class { dynamic result = null; try { #region SqlParameter参数 SqlParameter[] paras = new SqlParameter[8]; //页索引 paras[0] = new SqlParameter("pageIndex", DbType.Int32); paras[0].Value = pageinationInfo.PageIndex; //页大小 paras[1] = new SqlParameter("pageSize", DbType.Int32); paras[1].Value = pageinationInfo.PageSize; //表名 paras[2] = new SqlParameter("tableName", DbType.String); paras[2].Value = pageinationInfo.TableName; //查询字段 //EF仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...??? paras[3] = new SqlParameter("fieldName", DbType.String); paras[3].Value = pageinationInfo.FieldName; //where条件 paras[4] = new SqlParameter("whereCondition", DbType.String); paras[4].Value = pageinationInfo.WhereCondition; //order条件 paras[5] = new SqlParameter("orderCondition", DbType.String); paras[5].Value = pageinationInfo.OrderCondition; //总数 paras[6] = new SqlParameter("totalCount", DbType.Int32); paras[6].Value = pageinationInfo.TotalCount; paras[6].Direction = ParameterDirection.Output; //总页数 paras[7] = new SqlParameter("totalPages", DbType.Int32); paras[7].Value = pageinationInfo.TotalPages; paras[7].Direction = ParameterDirection.Output; #endregion string sql = "Procedure_SpiltPage @pageIndex,@pageSize,@tableName,@fieldName,@whereCondition,@orderCondition,@totalCount output,@totalPages output"; var list = db.Database.SqlQuery<T>(sql, paras).ToList(); PageinationData data = new PageinationData(); data.TotalCount= (int)paras[6].Value; data.TotalPages= (int)paras[7].Value; data.DataList = list; result = data; } catch(Exception e) { throw; } return result; } } }
分页实现类
3、调用并返回数据:
PageinationImplement pageImpl = new PageinationImplement(db); PageinationInfo pageination = new PageinationInfo(); pageination.TableName = "NewsInfo"; pageination.PageIndex = 1; pageination.PageSize = 15; pageination.FieldName = "*"; pageination.OrderCondition = "PostTime desc"; pageination.WhereCondition = "Isdelete=0"; var data = pageImpl.GetPageinationData<NewsInfo>(pageination);
上面的new PageinationImplement(db)中的db是数据库上下文(DbContext实例),
上面的data里包括了分页列表,总记录数,分页页数 信息。
注:本来我执行存储过程,想只查询表的部分字段,结果会报错,暂时只能用*查询所有字段,
网上查说EF暂时仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...
我能想到的方法就是自定义类,不用对应数据库的实体类。
不知道有没有其他方法可以实现,各位大神如果有方法的话,希望指教一下,谢谢!
相关文章推荐
- Oracle分页存储过程及PLSQL中的调用脚本
- 一个SQL存储过程分页和ASP调用
- c#调用多个可选条件查询的分页存储过程
- 一个简单的oracle分页存储过程的实现和调用
- C# 调用带有输出参数的分页存储过程
- 针对分页存储过程调用的C#类
- java调用分页存储过程
- 千万级数据分页存储过程 asp.net页面调用分页全过程
- Hibernate 调用SQL Server 2005 分页存储过程
- ASP.NET 分页存储过程 及 调用
- Oracle分页存储过程及PLSQL中的调用脚本
- 【SQLSERVER学习笔记】分页存储过程+调用
- Delphi调用SQL分页存储过程实例
- ssh三大框架,三层架构 整合测试!完整分页代码,JdbcTemplate等测试,存储过程调用,留着以后复习吧
- 一个简单的oracle分页存储过程的实现和调用
- winform 调用存储过程显示分页列表
- 自定义分页存储过程 及VB.NET 调用
- Oracle分页存储过程及java的具体调用方法
- JAVA调用sql server2000的分页存储过程