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的可以去看一下

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

原文地址:https://www.cnblogs.com/jcy1/p/9753921.html

时间: 2024-08-29 12:39:31

EF code first 分页显示的相关文章

数据资料的分页显示,增删改

题目要求: 1,查找数据库资料,分页显示, 2,可以增.删.改, 3,可以按条件查找. main.php 1 <?php 2 include("./init.inc.php"); 3 4 include("../DBDA.class.php"); 5 $db = new DBDA(); 6 7 include("page.class.php"); 8 9 //$_GET["name"]; 10 //$_GET["

java web 简单的分页显示

题外话:该分页显示是用 “表示层-控制层-DAO层-数据库”的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指定页的数据,在表示层通过 EL 表达式和 JSTL 将该页数据显示出来. 重点:两个方法:(1)计算总的页数. (2)查询指定页数据. 1.DAO层-数据库 JDBCUtils 类用于打开和关闭数据库,核心代码如下: 1 import java.sql.Connection; 2 import ja

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.

EF code first 创建和初始化数据库

1.前言 Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码对象来生成数据库.当然我们在实际开发过程当中要做单元测试.进而每次测试的时候要对库进行初始化,这样就不会因上次测试而对本次测试有所影响.下面是具体的实现. 2.建立对象 2.1建立对象 /// <summary> /// 缴费项目 /// </summary> public class fee_item : fee

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

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

EF Code First DataAnnotations

Key EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体.CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID.id或者[ClassName]Id,将映射为数据表中的主键如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常.如果想要自定义主键列名,则可以使用Key注释 [Key] public int MyId { get; set; } Required 当要求数据库在字段,不能为空时 [Required]public string B

EF Code First自定义数据库(服务器及数据库名)连接配置

EF Code First数据库连接配置 通过EF Code First创建新的数据库,默认的都是: 命名空间.Models.MovieDbContext之类的数据库文件,如果想用自定义的数据库名称,则可以用下面的方法: 1.1.首先必须建立好Model文件 Models中Movie.cs 1 using System; 2 using System.ComponentModel.DataAnnotations; 3 using System.Data.Entity; 4 5 namespace

Android Fragment分页显示的实现

分页显示有两种方式 一种是使用ViewPager 另一种是使用FragmentTransaction 上代码 1 FragmentTransaction实现方式 public class MainActivity extends FragmentActivity implements View.OnClickListener { private AllPhotosFragment allPhotosFragment; private MyAlbumFragment myAlbumFragment

PHP+Mysql————数据分页显示技术

通常情况下,一个页面加载大量的数据时,数据不可能同时显示出来.这时候,比较常用的方法就是滚动条和分页.看过电子书的孩子都知道,电子书那么多字,一个手机或pad的屏幕是无法全部显示的,开玩笑,一本几兆的书就好几百万字,一下子放到几寸的屏幕上,不得亮瞎你的眼.所以我们都是下滑使文字进行滚动或翻页.这篇博文就用来分享一下php的分页技术. 首先获取数据库中某表的数据,输出到网页上,然后再进行分页显示.一句话就讲明白了,但具体怎么分页的,请看代码. <?php header("content-ty