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

      Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架。此框架将数据库中的表信息通过xml与实体类对象相关联,使得开发人员只需要关心实体对象,而不需要手动操作数据库,对实体对象的修改会映射到数据库中,这样大大提高了开发效率。以下代码使用了EF、泛型、泛型委托、lambda、匿名类、dynamic动态类型等知识完成了EF的crud,并且提供了一个高效的通用分页查询方法,采用了延时加载,返回值类型是IQueryable。
 using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text; namespace EFtest
{
class Program
{
static void Main(string[] args)
{
testEntities context = new testEntities(); //增
//T_Test t = new T_Test() {Name="小林" };
//context.T_Test.Add(t);
//context.SaveChanges(); //删
//lambda方式
//var t = context.T_Test.Where(u=>(u.Id==1)).FirstOrDefault(); //linq to sql方式
//var t = (from u in context.T_Test
// where u.Id == 1
// select u).FirstOrDefault();
//context.T_Test.Remove(t);
//context.SaveChanges();
//数据的删除用这种方式更方便,效率更高
//T_Test t = new T_Test() { Id=2 };
//context.Entry<T_Test>(t).State=EntityState.Deleted;
//context.SaveChanges(); //改
//var t = (from u in context.T_Test
// where u.Id == 2
// select u).FirstOrDefault();
//t.Name = "小林";
//context.SaveChanges(); //查
//var t = (from u in context.T_Test
// where u.Id == 2
// select u).FirstOrDefault();
//Console.WriteLine(t.Id + t.Name); //通用分页
int count;
GetPageListParameter<T_Test, int> parameter=new GetPageListParameter<T_Test,int>();
parameter.isAsc=true;
parameter.orderByLambda = s => s.Id;
parameter.pageIndex = ;
parameter.pageSize = ;
parameter.selectLambda = s => new Person{Name=s.Name };
parameter.whereLambda = s => s.Id > ; var data = GetPageList<T_Test, int>(parameter, out count); foreach (Person t in data)
{
Console.WriteLine(t.Name);
} Console.ReadKey();
} public static List<dynamic> GetPageList<T, TKey>(GetPageListParameter<T, TKey> parameter, out int count) where T : class
{
testEntities context = new testEntities();
//注意顺序
count = context.Set<T>().Where<T>(parameter.whereLambda).Count();
var list = context.Set<T>().Where<T>(parameter.whereLambda);
if (parameter.isAsc)
{
list = list.OrderBy(parameter.orderByLambda);
}
else
{
list = list.OrderByDescending(parameter.orderByLambda);
} return list.Skip((parameter.pageIndex - ) * parameter.pageSize).Take(parameter.pageSize).Select(parameter.selectLambda).ToList();
}
} //取所需列
public class Person
{
public string Name { get; set; }
} //封装方法参数
public class GetPageListParameter<T, TKey>
{
public Expression<Func<T, dynamic>> selectLambda { get; set; }
public Expression<Func<T, bool>> whereLambda { get; set; }
public Expression<Func<T, TKey>> orderByLambda { get; set; }
public int pageSize { get; set; }
public int pageIndex { get; set; }
public bool isAsc { get; set; }
}
}

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

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

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  2. 防SQL注入:生成参数化的通用分页查询语句

    原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...

  3. sqlsever 创建一个通用分页查询

    -- Author: Mis Chen-- Create date: 2018年5月15日 11:21:47-- Description: 创建一个通用分页查询-- ================= ...

  4. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  5. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  6. Oracle 存储过程之通用分页查询

    在数据库中书写通用分页存储过程,有利于代码的维护以及执行效率的提升 create or replace procedure Sp_QueryDatePage ( tableName in varcha ...

  7. MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

    1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...

  8. 利用EF Core的Join进行多表查询

    背景 话说有这么一家子,老公养了一条狗,老婆养了一只猫. 数据库的设计 人表 宠物表 通过表可以知道,宠物通过Owner指向主人的Id. 问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎 ...

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

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. 大数据入门第二十二天——spark(二)RDD算子(2)与spark其它特性

    一.JdbcRDD与关系型数据库交互 虽然略显鸡肋,但这里还是记录一下(点开JdbcRDD可以看到限制比较死,基本是鸡肋.但好在我们可以通过自定义的JdbcRDD来帮助我们完成与关系型数据库的交互.这 ...

  2. redis系列--深入哨兵集群

    一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...

  3. JSON传输数组的基本操作

    目标JSON结果如下: 生成JSON的的过程如下: Document document; Document::AllocatorType& allocator = document.GetAl ...

  4. 微信小程序之路由

    1. 路由方式 路由方式 触发时机 路由前页面 路由后页面 初始化 小程序打开的第一个页面 onLoad, onShow 打开新页面 调用 API wx.navigateTo 或使用组件 onHide ...

  5. [CF1039E]Summer Oenothera Exhibition[根号分治+lct]

    题意 给一个长度为 \(n\) 的序列, \(q\) 次询问,次给一个 \(k_i\) ,问最少将序列划分成多少次,满足每一段的极差不超过\(w−k_i\). \(1 \leq n, q \leq 1 ...

  6. R语言学习 第五篇:字符串操作

    文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符. 一,字符串中的字符数量 函数nchar()用于获得字符串中的字符数量: > s ...

  7. Java 多线程之 Thread 类 和 Runnable 接口初步使用

    目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...

  8. Mac 上flink的安装与启动

    在Mac 上安装flink,需要通过Homebrew安装的 1.howmebrew的安装方式,在终端粘贴以下命令,或者去官网https://brew.sh/index_zh-cn 找到此代码复制粘贴到 ...

  9. Nextcloud13私有云盘安装指南

    一.环境说明: ※操作系统版本CentOS 7.5 Minimal-1804 ※操作系统版本已经使用163 YUM源 ※ Nextcloud版本 13.05 ※ 数据库使用MariaDB,安装在同一台 ...

  10. 小学生都能写智能语音助手了,我这颗转战AI的心要何去何从?

    前言——我是不是老了 前天看了一个关于AI类的综艺节目我感觉整个人都不好了.这个综艺的名字叫<智造将来>上面那个小屁孩自己写了一个智能语音助手,这个小屁孩叫袁翊闳是2018年百度AI开发者 ...