首页 > 代码库 > 利用EF和C#泛型实现通用分页查询

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

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

      Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架。此框架将数据库中的表信息通过xml与实体类对象相关联,使得开发人员只需要关心实体对象,而不需要手动操作数据库,对实体对象的修改会映射到数据库中,这样大大提高了开发效率。以下代码使用了EF、泛型、泛型委托、lambda、匿名类、dynamic动态类型等知识完成了EF的crud,并且提供了一个高效的通用分页查询方法,采用了延时加载,返回值类型是IQueryable。
  1 using System;  2 using System.Collections.Generic;  3 using System.Data.Entity;  4 using System.Linq;  5 using System.Linq.Expressions;  6 using System.Text;  7   8 namespace EFtest  9 { 10     class Program 11     { 12         static void Main(string[] args) 13         { 14             testEntities context = new testEntities(); 15  16             // 17             //T_Test t = new T_Test() {Name="小林" };           18             //context.T_Test.Add(t); 19             //context.SaveChanges(); 20  21  22             // 23             //lambda方式 24             //var t = context.T_Test.Where(u=>(u.Id==1)).FirstOrDefault(); 25  26             //linq to sql方式 27             //var t = (from u in context.T_Test 28             //         where u.Id == 1 29             //         select u).FirstOrDefault(); 30             //context.T_Test.Remove(t); 31             //context.SaveChanges(); 32             //数据的删除用这种方式更方便,效率更高 33             //T_Test t = new T_Test() { Id=2 }; 34             //context.Entry<T_Test>(t).State=EntityState.Deleted; 35             //context.SaveChanges(); 36  37             // 38             //var t = (from u in context.T_Test 39             //         where u.Id == 2 40             //         select u).FirstOrDefault(); 41             //t.Name = "小林"; 42             //context.SaveChanges(); 43  44             // 45             //var t = (from u in context.T_Test 46             //         where u.Id == 2 47             //         select u).FirstOrDefault(); 48             //Console.WriteLine(t.Id + t.Name); 49              50             //通用分页 51             int count;           52             GetPageListParameter<T_Test, int> parameter=new GetPageListParameter<T_Test,int>(); 53             parameter.isAsc=true; 54             parameter.orderByLambda = s => s.Id; 55             parameter.pageIndex = 1; 56             parameter.pageSize = 3; 57             parameter.selectLambda = s => new Person{Name=s.Name }; 58             parameter.whereLambda = s => s.Id > 3; 59  60             var data = http://www.mamicode.com/GetPageListint>(parameter, out count); 61  62             foreach (Person t in data) 63             { 64                 Console.WriteLine(t.Name); 65             } 66  67             Console.ReadKey(); 68         } 69  70         public static List<dynamic> GetPageList<T, TKey>(GetPageListParameter<T, TKey> parameter, out int count) where T : class 71         { 72             testEntities context = new testEntities(); 73             //注意顺序 74             count = context.Set<T>().Where<T>(parameter.whereLambda).Count(); 75             var list = context.Set<T>().Where<T>(parameter.whereLambda); 76             if (parameter.isAsc) 77             { 78                 list = list.OrderBy(parameter.orderByLambda); 79             } 80             else 81             { 82                 list = list.OrderByDescending(parameter.orderByLambda); 83             } 84  85             return list.Skip((parameter.pageIndex - 1) * parameter.pageSize).Take(parameter.pageSize).Select(parameter.selectLambda).ToList(); 86         } 87     } 88  89     //取所需列 90     public class Person 91     { 92         public string Name { get; set; } 93     } 94  95     //封装方法参数 96     public class GetPageListParameter<T, TKey> 97     { 98         public Expression<Func<T, dynamic>> selectLambda { get; set; } 99         public Expression<Func<T, bool>> whereLambda { get; set; }100         public Expression<Func<T, TKey>> orderByLambda { get; set; }101         public int pageSize { get; set; }102         public int pageIndex { get; set; }103         public bool isAsc { get; set; }104     }105 }

 

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