此文讲述mvc4+entityframework6+sqlserver2008环境下调用存储过程,实现分页。

1、分页存储过程代码如下:

分页原理用的row_number()和over()函数实现(没有用top、not in,因为性能低;sqlserver2012有新特性,用offset、fetch实现)。

这里支持多表查询分页。

SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[Procedure_SpiltPage]
( @pageIndex INT =1, --页索引
@pageSize INT =10, --页大小
@tableName NVARCHAR(100), --表名
@fieldName NVARCHAR(200) ='*', --查询字段
@whereCondition NVARCHAR(800) ='1=1', --where条件
@orderCondition NVARCHAR(200), --order条件
@recordTotal INT OUTPUT, --输出记录总数
@pageCount INT OUTPUT --输出分页数
) AS
BEGIN
DECLARE @sqlStr NVARCHAR(1000); SET NOCOUNT ON; --不返回计数 --返回记录总数
SET @sqlStr = 'SELECT @recordTotal = COUNT(*) FROM '+@tableName+' WHERE '+@whereCondition
EXEC sp_executesql @sqlStr,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT
SET @pageCount=(@recordTotal+@pageSize-1)/@pageSize --查询列表
--如果是第一页
IF (@pageIndex<=1)
BEGIN
--N'表示强制转换为Unicode字符,不会乱码
SET @sqlStr=N'SELECT TOP '+CAST(@pageSize AS VARCHAR)+' '+@fieldName+' FROM '+@tableName+' WHERE '+@whereCondition+' ORDER BY '+@orderCondition
END
ELSE
BEGIN
--为了适应多表查询,下面把第一处@fieldName改为*,这里不查询全部字段,因为第二个@fieldName
SET @sqlStr=N'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@orderCondition+') AS rownum, '
+@fieldName+' FROM '+@tableName+' WHERE '+@whereCondition+') AS myTable WHERE rownum BETWEEN '
+CAST(((@pageIndex-1)*@pageSize+1) AS NVARCHAR)+' AND '+CAST((@pageIndex*@pageSize) AS NVARCHAR)
END EXEC (@sqlStr) SET NOCOUNT OFF;
END GO

存储过程

在数据库中测试,可以如下:

declare @total int
declare @pageCount int
exec Procedure_SpiltPage 1,15,'NewsInfo','*','1=1','PostTime desc',@total output,@pageCount output
select @total as total,@pageCount as pageCounts

执行测试代码

2、分页实现代码:

2.1、分页信息类如下:

namespace WebUI.PageinationService
{
/// <summary>
/// 分页信息类
/// </summary>
public class PageinationInfo
{
/// <summary>
/// 页索引
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 页大小
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总数
/// </summary>
public int TotalCount { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 表名
/// </summary>
public string TableName { get; set; }
/// <summary>
/// 主键
/// </summary>
public string KeyName { get; set; }
/// <summary>
/// 查询字段
/// </summary>
public string FieldName { get; set; }
/// <summary>
/// where条件(不带'where')
/// </summary>
public string WhereCondition { get; set; }
/// <summary>
/// 排序条件,如:id desc ,或者:id desc,name asc
/// </summary>
public string OrderCondition { get; set; }
}
}

分页信息类

2.2、分页数据类(用以返回)

namespace WebUI.PageinationService
{
/// <summary>
/// 分页数据类
/// 用以将分页集合和总数,总页数等打包一起返回
/// </summary>
public class PageinationData
{
/// <summary>
/// 总数
/// </summary>
public int TotalCount { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int TotalPages { get; set; } /// <summary>
/// 集合
/// </summary>
public dynamic DataList { get; set; }
}
}

分页数据类

2.3、分页实现类:

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[];
//页索引
paras[] = new SqlParameter("pageIndex", DbType.Int32);
paras[].Value = pageinationInfo.PageIndex;
//页大小
paras[] = new SqlParameter("pageSize", DbType.Int32);
paras[].Value = pageinationInfo.PageSize;
//表名
paras[] = new SqlParameter("tableName", DbType.String);
paras[].Value = pageinationInfo.TableName;
//查询字段
//EF仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...???
paras[] = new SqlParameter("fieldName", DbType.String);
paras[].Value = pageinationInfo.FieldName;
//where条件
paras[] = new SqlParameter("whereCondition", DbType.String);
paras[].Value = pageinationInfo.WhereCondition;
//order条件
paras[] = new SqlParameter("orderCondition", DbType.String);
paras[].Value = pageinationInfo.OrderCondition;
//总数
paras[] = new SqlParameter("totalCount", DbType.Int32);
paras[].Value = pageinationInfo.TotalCount;
paras[].Direction = ParameterDirection.Output;
//总页数
paras[] = new SqlParameter("totalPages", DbType.Int32);
paras[].Value = pageinationInfo.TotalPages;
paras[].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[].Value;
data.TotalPages= (int)paras[].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 = ;
pageination.PageSize = ;
pageination.FieldName = "*";
pageination.OrderCondition = "PostTime desc";
pageination.WhereCondition = "Isdelete=0";
var data = pageImpl.GetPageinationData<NewsInfo>(pageination);

上面的new PageinationImplement(db)中的db是数据库上下文(DbContext实例),

上面的data里包括了分页列表,总记录数,分页页数 信息。

注:本来我执行存储过程,想只查询表的部分字段,结果会报错,暂时只能用*查询所有字段,

网上查说EF暂时仅支持返回返回某个表的全部字段,以便转换成对应的实体,无法支持返回部分字段的情况...

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

不知道有没有其他方法可以实现,各位大神如果有方法的话,希望指教一下,谢谢!

mvc,EntityFramework调用分页存储过程的更多相关文章

  1. EF框架 与 Dapper框架 调用分页存储过程

    1. SqlServer创建存储过程: --创建存储过程 create proc sp_Show ( @index int, --当前页 @size int, --每页大小 @totalcount i ...

  2. SQLserver 的分页存储过程

      -- 1.建立修改学生数据的存储过程 -- 2.建立根据班级Id和学生姓名模糊查询的分页存储过程,要求正确输出总记录数,总页数-- (输入班学生姓名 计算总记录数 计算总页数) -- @name ...

  3. EntityFramework 4使用存储过程分页

    CREATE PROC usp_OrgPage_SQL @pageIndex INT, @pageSize INT, @totalCount INT OUTPUT AS BEGIN SET @tota ...

  4. 完整的分页存储过程以及c#调用方法

    高效分页存储过程 USE [db] GO /****** 对象: StoredProcedure [dbo].[p_Page2005] 脚本日期: // :: ******/ SET ANSI_NUL ...

  5. Oracle分页存储过程及PLSQL中的调用脚本

    撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家 测试步骤:1.运行创建包命令;2.运行创建存储过程命令;3.运行调用分页存储过程语句 测试环境:wind ...

  6. MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied.

    MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied. ...

  7. Delphi调用SQL分页存储过程实例

    Delphi调用SQL分页存储过程实例 (-- ::)转载▼ 标签: it 分类: Delphi相关 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存 ...

  8. ADO调用分页查询存储过程

    一.分页存储过程 ----------使用存储过程编写一个分页查询----------------------- set nocount off --关闭SqlServer消息 --set nocou ...

  9. C# 调用带有输出参数的分页存储过程

    一.创建带有输出参数的分页存储过程 use StudentMISDB go select * from Course alter table Course go --update Course set ...

随机推荐

  1. Spark学习笔记——构建分类模型

    Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术, ...

  2. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库——安装配置NTP服务,保证集群时间保持同步

    一.所有节点上使用yum安装配置NTP服务yum install ntp -y 二.选定一台节点作为NTP server, 192.168.58.11修改/etc/ntp.conf vim /etc/ ...

  3. Ant 学习笔记

    1.下载Ant 官方网站http://ant.apache.org/bindownload.cgi 下载最新版本  .zip archive: apache-ant-1.9.4-bin.zip [PG ...

  4. 【QT】第一个QT程序(点击按钮,显示特定文本)

    1.基类选 QWidget 2.添加UI Btnshowhello 按钮 labelhello 文本标签 要注意:文本字样和对象名的区别! 对象名和UI部件是一一对应的关系. 修改对象名和修改文本字样 ...

  5. [Android Studio] Using API of OpenCV DNN

    前言 一.故事背景 NDK方法人脸识别 OpenCV4Android系列: 1. OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio 2.OpenC ...

  6. [UI] 01 - CSS

    前言 一.认识 From: http://www.runoob.com/css/css-tutorial.html CSS 指层叠样式表 (Cascading Style Sheets) 解决内容与表 ...

  7. 【代码审计】大米CMS_V5.5.3 任意文件删除及代码执行漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  8. Mariadb 10.3.5 序列号(sequence) 尝鲜

    除了Oracle Mariadb 也有sequence了,前提是Mariadb 10.3以上版本才支持. 但目前的正式版依然是10.2 启动一个Mariadb 10.3.5 docker pull m ...

  9. C++判断是否连接服务器

    BOOL CheckServerStatus::isConnectServer(CString serverName, int serverPort) { CString strURL; strURL ...

  10. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...