您的位置:首页 > 其它

mvc,EntityFramework调用分页存储过程

2017-05-08 11:36 351 查看
此文讲述mvc4+entityframework6+sqlserver2008环境下调用存储过程,实现分页。

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暂时仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...

我能想到的方法就是自定义类,不用对应数据库的实体类。

不知道有没有其他方法可以实现,各位大神如果有方法的话,希望指教一下,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: