封装EF code first用存储过程的分页方法

一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生。

记录一下封装好的分页代码

首先先说下 我使用EF codefirst的目的. 是因为可以有更纯净的代码 不再有EDMX这些东西  而不是真正的用 code first 先有代码 再生成数据库.所以 我虽然使用

的是codefirst 但是本质依然是数据库优先.这个大家可以网上找资料

在基类中写好方法

public class BaseService
{
    public static XOContext db = null;

    public BaseService()
    {
      db = new XOContext();
    }

    public static List<T> SelectPageList<T>(string sqlstr, int pageIndex, int pagesize, string orderByField, ref int totalCount) where T : class
    {
           SqlParameter[] spm = new SqlParameter[5];
           spm[0] = new SqlParameter("@Sql", sqlstr);
           spm[1] = new SqlParameter("@PageIndex", pageIndex);
           spm[2] = new SqlParameter("@PageSize", pagesize);
           spm[3] = new SqlParameter("@OrderByField", orderByField);
           spm[4] = new SqlParameter("@TotalRecord", totalCount);
           spm[4].Direction = ParameterDirection.Output;
           var data = db.Database.SqlQuery<T>("exec Pro_PageProcedure @Sql,@PageIndex,@PageSize,@OrderByField,@TotalRecord out", spm).ToList();
           totalCount = Convert.ToInt32(spm[4].Value.ToString());
           return data;
     }
}

因为直接用linq的分页方式感觉效率还是不是很高,所以改用存储过程,上面方法用泛型的方式,可以灵活的调用。存储过程网上很多,也可以自己写一个,以下是我用的存储过程

CREATE PROCEDURE [dbo].[Pro_PageProcedure]
 @Sql nvarchar(max),        --表名
 @PageIndex int = 1 ,            --指定当前为第几页
 @PageSize int,                    --每页多少条记录
 @OrderByField nvarchar(1000),        --row_number需要的排序字段
 @TotalRecord int output           --返回总页数
as
    Declare @_sql nvarchar(max);    

    --计算总记录数

    set @_sql = ‘select @TotalRecord = count(*) from (‘ + @Sql + ‘) a‘

   EXEC sp_executesql @_sql,N‘@TotalRecord int OUTPUT‘,@TotalRecord OUTPUT--计算总记录数        

    Declare @StartRecord int
    Declare @EndRecord int

    set @StartRecord = (@pageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @pageSize - 1

   set @_sql =‘select * from ( select ROW_NUMBER() Over(‘ + @OrderByField + ‘) as _ttRowId,* from (‘ +  @Sql + ‘) _tt0 ) _tt1 ‘
   set @_sql = @_sql + ‘where _ttRowId between ‘ + CAST(@StartRecord as nvarchar) + ‘ and ‘ + CAST(@EndRecord as nvarchar)

    Exec(@_sql)

上面方法写在基类,各个子类继承基类都可以直接调用此方法进行分页查询,以下是其中一个子类调用

/// <summary>
        /// 获取分页列表
        /// </summary>
        /// <returns></returns>
        public List<FixedAnswer> GetPageList(int pageIndex, int pageSize, ref int totalCount)
        {
            string strSql = "select * from FixedAnswer";
            string orderfied = "order by id desc";
            return SelectPageList<FixedAnswer>(strSql, pageIndex, pageSize, orderfied, ref totalCount);
        }

注意这里传的实体对象类FixedAnswer是对应表FixedAnswer,假如我们可能不需要查询这个表的所有字段,那必须把某些字段提取出现建立一个对应的实体类,因为SqlQuery<T>的方法返回的对象都是要求对象属性都是一一对应。联表查询也可以使用这样的方式

这样每次都要建立一个相应的实体对象似乎有些麻烦,但是有时用起来还是不错的,网上也有直接返回DataTable的可以去看一下

表达能力有限很少写博客,只是用来记录,不喜勿喷。

来自:http://www.cnblogs.com/gangtienanzi/p/5377492.html

时间: 2024-11-14 16:12:09

封装EF code first用存储过程的分页方法的相关文章

EF code first 分页显示

一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefirst的目的. 是因为可以有更纯净的代码 不再有EDMX这些东西  而不是真正的用 code first 先有代码 再生成数据库.所以 我虽然使用 的是codefirst 但是本质依然是数据库优先.这个大家可以网上找资料 在基类中写好方法 public class BaseService { pub

从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑

前言      从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章的评论,在里面能看出有很多种声音,有支持的我的朋友给我加油打气,有分享自己工作经历的朋友,有提出忠肯意见的朋友,有对记事本写代码吐槽的朋友,也有希望让我换个行业的,觉得我可能不适合这个行业朋友,不管怎样,我都接受,都是大家同行的一些忠告,谢谢大家. 首先我要在这里感谢很多博客园里面的大牛,写了很多系

调用存储过程进行分页实例

我在这使用SQL server数据库和我已有的数据库中的表.表名: HKSJ_Main 1.创建存储过程 --该分页的原理 越过多少条,去多少条 create proc P_page --声明参数@size int , --一页取几条@pageindex int,--取第几页@total int out --返回总条数as beginselect top(@size)* from dbo.HKSJ_Main as B where B.ID not in ( select top((@pagein

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

http://www.cnblogs.com/darrenji/p/3809219.html 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用EF Code First创建领域模型和EF上下文■ 4.三层架构设计    □ 4.1 创建DAL层        ※ 4.1.1 MySportsStore.IDAL详解        ※ 4.1.2 MySportsStore.DAL详解 1.搭建项目 MySportsStore.

封装MVC的分页方法

一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 public static List<T> SelectPageList<T>(DbSet<T> source, string sqlstr, int pageIndex, int pagesize, string orderByField, ref int totalCount) where T : cla

利用EF和C#泛型实现通用分页查询

利用EF和C#泛型实现通用分页查询 Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架.此框架将数据库中的表信息通过xml与实体类对象相关联,使得开发人员只需要关心实体对象,而不需要手动操作数据库,对实体对象的修改会映射到数据库中,这样大大提高了开发效率.以下代码使用了EF.泛型.泛型委托.lambda.匿名类.dynamic动态类型等知识完成了EF的crud,并且提供了一个高效的通用分页查询方法,采用了延时加载,

EF Code First:数据更新最佳实践

EF Code First:数据更新最佳实践 最近在整理EntityFramework数据更新的代码,颇有体会,觉得有分享的价值,于是记录下来,让需要的人少走些弯路也是好的.为方便起见,先创建一个控制台工程,使用using(var db = new DataContext)的形式来一步一步讲解EF数据更新的可能会遇到的问题及对应的解决方案.在获得最佳方案之后,再整合到本系列的代码中. 一.前言 最近在整理EntityFramework数据更新的代码,颇有体会,觉得有分享的价值,于是记录下来,让需

EF Code First 配置的相关内容

I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 1 /// <summary> 2 /// 用户照片类 3 /// </summary> 4 public class PersonPhoto 5 { 6 [Key] 7 public int PersonId { get ; set ; } 8 public byte [] Photo { get ; set ; } 9 public string Caption { get ; set ; } // 标题