1. 程式人生 > >EntityFramework呼叫分頁儲存過程

EntityFramework呼叫分頁儲存過程

感謝博主https://www.cnblogs.com/qk2014/p/6824103.html

此文講述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[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裡包括了分頁列表,總記錄數,分頁頁數 資訊。

相關推薦

EntityFramework呼叫儲存過程

感謝博主https://www.cnblogs.com/qk2014/p/6824103.html 此文講述mvc4+entityframework6+sqlserver2008環境下呼叫儲存過程,實現分頁。 1、分頁儲存過程程式碼如下: 分頁原理用的row_nu

Vs呼叫儲存過程

/// <summary>         /// 顯示+分頁+模糊查詢         /// </summary>  &n

sqlServer儲存過程呼叫

現象: sqlServer的分頁一直相對比較複雜。這裡使用儲存過程實現分頁邏輯 解決辦法 1:action獲取查詢的條件,初始化每頁顯示的大小,page代表當前檢視第幾頁,預設設定為第一頁。rows表示每頁顯示的大小。sort代表查詢按什麼欄位排序 如果要

C#呼叫SQL Server儲存過程

以SQL Server2012提供的offset ..rows fetch next ..rows only為例e.g.表名:Tab1 ---------------------------------- ID Name 1 tblAttributeGroupDetail 2

mysql儲存過程一步一步實現

1.  CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( IN `TableName` VARCHAR(200), IN `FieldList` VARCHAR(2000) , IN `Pr

MSSQL資料庫儲存過程

create procedure [dbo].[p_splitpage] @sql nvarchar(4000), @currentpage int=2, @pagesize int=10, @recordcount int=0 output, @pagecount int=0 out

儲存過程

-- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: &l

【資料庫效能測試實戰】測試不同儲存過程在10w,100w以及1000w資料量下面的表現

前言 資料庫的效能與每一行程式碼息息相關,所以,每次寫程式碼可以考慮一下在不同級別的資料量下面測試一下效能。 本文參考了: Postgresql生成大量測試資料 以及 準備測試用資料 此次測試我們將分別用10w,100w以及1000w級別的表來測試,下面先建立

增刪改查儲存過程

--建立資料庫 CREATE DATABASE PROCDB GO --使用資料庫 GO USE PROCDB GO --建立表供儲存過程的實現 CREATE TABLE STUDENTINFOS ( ID INT PRIMARY KEY IDENTITY, S_NAME NVARCHA

C# DataGridView功能(SQL儲存過程實現)

{            dtStaff.Clear();            SqlConnection conn = new SqlConnection(Param_Class.Param_DB.strConn);            SqlDataAdapter Sda = new SqlDataA

-儲存過程5種寫法 sqlserver

在SQL Server資料庫操作中,我們常常會用到儲存過程對實現對查詢的資料的分頁處理,以方便瀏覽者的瀏覽。本文我們總結了五種SQL Server分頁儲存過程的方法,並對其效能進行了比較,接下來就讓我們來一起了解一下這一過程。 建立資料庫data_Test : create

通用的可帶查詢條件的SQL語句的儲存過程(2)

程式碼二: CREATE PROCEDURE pagination @tblName varchar(255), – 表名 @strGetFields varchar(1000) = ‘*’, – 需要返回的列 @fldName varch

MySql 儲存過程

DELIMITER $$ #修改分隔符為 $$ DROP PROCEDURE IF EXISTS sp_MvcCommonDataSource$$ #分隔符 CREATE PROCEDURE sp_MvcCommonDataSource ( #輸入引數 _fields

MySQL使用limit的通用儲存過程

輸出的結果:通用分頁儲存過程的程式碼:@a   代表要查詢的列名@b  代表要查詢的表名@c   代表從多少個開始@d   代表每次顯示多少條資料DELIMITER $$ USE `t204`$$ DROP PROCEDURE IF EXISTS `pro_01`$$

MYSQL多表儲存過程

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_AllSiteSearch`(IN pagesize int,IN pageindex int,IN skey varchar(100),IN dt varchar(10),IN

大資料量儲存過程效率測試

我首先寫了五個常用儲存過程: 1,利用select top 和select not in進行分頁,具體程式碼如下: CREATE PROCEDURE Proc_paged_with_notin --利用select top and select n

Sqlserver,MySql 通用儲存過程

MySql 分頁儲存過程 CREATE PROCEDURE ProcPage( in tableName varchar(20),#表名 in showField varchar(100),#要顯示的列名 in whereText varchar(500),#where條件(只需要寫where後面的語句)

SqlServer支援多表關聯的儲存過程

具體程式碼如下所示: CREATE PROCEDURE p_GetPager @TotalCount INT OUTPUT, --總記錄數 @TotalPage INT OUTPUT, --總頁數 @Table NVARCHAR(1

Oracle 高效儲存過程例項 含javademo

  關於分頁,想必是每一程式猿都會遇到的問題,解決辦法有很多,  接下來就讓我們嘗試下 oracle 儲存過程實現,直接在資料庫層面實現,重點在於高效  1首先建立 儲存過程用的包,以及宣告儲存過程 --建立包 -- Author : Sugar -- Created

一個儲存過程

CREATE PROCEDURE SSO_MyPager @tblName   varchar(255),       -- 表名 @strGetFields varchar(1000) = '*',  -- 需要返回的列 @fldName varchar(255)='',