利用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 = GetPageList<T_Test, int>(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 }
时间: 2024-11-10 02:18:03

利用EF和C#泛型实现通用分页查询的相关文章

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

javaWeb_JDBC_利用反射以及JDBC元数据编写通用的查询方法

JDBC利用反射以及元数据编写通用的查询方法[*****] 1.如何获取元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表, 表中的各个列,数据类型,触发器,存储过程等各方面的信息.根据这些信息,JDBC可以访问一个实现事先并不了解的数据库. 获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的. 2.元

bos 第4 (区域excel批量导入、区域通用分页查询、分区的添加、分区多条件分页查询、分区导出excel)

BOS项目笔记 第4天 今天内容安排: 1.区域批量导入功能 jQuery OCUpload(一键上传插件).apache POI.pinyin4j 2.实现区域的分页查询 3.对分页代码重构 4.添加分区(combobox下拉框) 5.分区的组合条件分页查询 6.分区数据导出功能 1. 区域数据批量导入功能 1.1 一键上传插件使用 ajax不能做文件上传. 第一步:在jsp页面中引入插件的js文件 <script type="text/javascript" src=&quo

利用反射及jdbc元数据实现通用的查询方法

--------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.customer类: package com.lanqiao.javatest; import java.sql.Date; public class Customer { p

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

JDBC:利用反射及JDBC元数据编写通用的查询方法

遇到了若干问题: 1.从oracle返回的列名都是大写,再用反射,就找不到相对应得 名字 2.oracle 中number类型 返回来,就变成了BigDecimal public static void main(String[] args){ String sql = "SELECT IDCARD , examcard , " + "studentname ," + "lacation LoCATION,grade " + " FRO

通用分页存储过程真的有注入漏洞吗?

原文:通用分页存储过程真的有注入漏洞吗? 今天看了两篇关于存储过程SQL注入漏洞的文章: 1):如此高效通用的分页存储过程是带有sql注入漏洞的 2):防SQL注入:生成参数化的通用分页查询语句 怎么看怎么觉的别扭,在我印象中存储过程是不会存在注入漏洞的啊?起码我目前的水平还不了解如何注入存储过程.如果大家有注入的方法请指教.换句话说存储过程本身并无注入漏洞,只不过有漏洞大多都是因为程序漏洞导致. 我们来简化下之前两位园友讨论的分页存储过程,原代码太长,我这里呢写一个针对一个单表查询的存储过程.

框架 day49 BOS项目练习3(修复window控件BUG,添加/修改/作废取派员,datagrid使用,分页查询(DetachedCriteria离线),formatter函数)

BOS项目笔记第3天 1.    修复window控件bug 把弹出窗口拖动到浏览器窗口外之后无法再拖动     将提供的outOfBounds.js文件复制到项目中     在需要修复的jsp页面引入js文件,可以阻止控件拖出窗口 <script src="${pageContext.request.contextPath }/js/easyui/outOfBounds.js" type="text/javascript"></script&