第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

一. 简介

   该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树、EF的基本使用、泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发。

 PS:在该章节对于EF的上下文怎么处理,怎么来的,不做介绍,在后续的框架篇将详细介绍,下面的EF上下文,将直接使用db代替。

 如果你对Expression、EF的增删改查、泛型生疏的话,可以先阅读以下章节:

  (1). Expression表达式目录树:http://www.cnblogs.com/yaopengfei/p/7486870.html

  (2). EF的基本增删改查:http://www.cnblogs.com/yaopengfei/p/7674715.html

  (3). 泛型的使用:http://www.cnblogs.com/yaopengfei/p/6880629.html

二. 代码封装分享

   下面的代码封装,主要就是围绕EF的增删改查进行封装以及各自对应的扩展,其中包括事务一体的封装、事务分离的封装、集成 Z.EntityFramework.Extensions 插件的封装、以及EF调用SQL语句的封装。

1. EF调用SQL语句:

复制代码

 1         /// <summary>2         /// 执行增加,删除,修改操作(或调用存储过程)3         /// </summary>4         /// <param name="sql"></param>5         /// <param name="pars"></param>6         /// <returns></returns>7         public int ExecuteSql(string sql, params SqlParameter[] pars)8         {9             return db.Database.ExecuteSqlCommand(sql, pars);
10         }
11 
12         /// <summary>
13         /// 执行查询操作
14         /// </summary>
15         /// <typeparam name="T"></typeparam>
16         /// <param name="sql"></param>
17         /// <param name="pars"></param>
18         /// <returns></returns>
19         public List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars)
20         {
21             return db.Database.SqlQuery<T>(sql, pars).ToList();
22         }

复制代码

2. EF增删改查封装(事务一体)

 (1). 新增

1   public int Add(T model)
2   {
3        DbSet<T> dst = db.Set<T>();
4        dst.Add(model);
5        return db.SaveChanges();
6   }

(2). 删除

复制代码

 1         /// <summary>2         /// 删除(适用于先查询后删除的单个实体)3         /// </summary>4         /// <param name="model">需要删除的实体</param>5         /// <returns></returns>6         public int Del(T model)7         {8             db.Set<T>().Attach(model);9             db.Set<T>().Remove(model);
10             return db.SaveChanges();
11         }
12         /// <summary>
13         /// 根据条件删除(支持批量删除)
14         /// </summary>
15         /// <param name="delWhere">传入Lambda表达式(生成表达式目录树)</param>
16         /// <returns></returns>
17         public int DelBy(Expression<Func<T, bool>> delWhere)
18         {
19             List<T> listDels = db.Set<T>().Where(delWhere).ToList();
20             listDels.ForEach(d =>
21             {
22                 db.Set<T>().Attach(d);
23                 db.Set<T>().Remove(d);
24             });
25             return db.SaveChanges();
26         }        

复制代码

(3). 查询

复制代码

 1         /// <summary>2         /// 根据条件查询3         /// </summary>4         /// <param name="whereLambda">查询条件(lambda表达式的形式生成表达式目录树)</param>5         /// <returns></returns>6         public List<T> GetListBy(Expression<Func<T, bool>> whereLambda)7         {8             return db.Set<T>().Where(whereLambda).ToList();9         }
10         /// <summary>
11         /// 根据条件排序和查询
12         /// </summary>
13         /// <typeparam name="Tkey">排序字段类型</typeparam>
14         /// <param name="whereLambda">查询条件</param>
15         /// <param name="orderLambda">排序条件</param>
16         /// <param name="isAsc">升序or降序</param>
17         /// <returns></returns>
18         public List<T> GetListBy<Tkey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true)
19         {
20             List<T> list = null;
21             if (isAsc)
22             {
23                 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda).ToList();
24             }
25             else
26             {
27                 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda).ToList();
28             }
29             return list;
30         }
31         /// <summary>
32         /// 分页查询
33         /// </summary>
34         /// <typeparam name="Tkey">排序字段类型</typeparam>
35         /// <param name="pageIndex">页码</param>
36         /// <param name="pageSize">页容量</param>
37         /// <param name="whereLambda">查询条件</param>
38         /// <param name="orderLambda">排序条件</param>
39         /// <param name="isAsc">升序or降序</param>
40         /// <returns></returns>
41         public List<T> GetPageList<Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true)
42         {
43 
44             List<T> list = null;
45             if (isAsc)
46             {
47                 list = db.Set<T>().Where(whereLambda).OrderBy(orderLambda)
48                .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
49             }
50             else
51             {
52                 list = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda)
53               .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
54             }
55             return list;
56         }
57         /// <summary>
58         /// 分页查询输出总行数
59         /// </summary>
60         /// <typeparam name="Tkey">排序字段类型</typeparam>
61         /// <param name="pageIndex">页码</param>
62         /// <param name="pageSize">页容量</param>
63         /// <param name="whereLambda">查询条件</param>
64         /// <param name="orderLambda">排序条件</param>
65         /// <param name="isAsc">升序or降序</param>
66         /// <returns></returns>
67         public List<T> GetPageList<Tkey>(int pageIndex, int pageSize, ref int rowCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, Tkey>> orderLambda, bool isAsc = true)
68         {
69             int count = 0;
70             List<T> list = null;
71             count = db.Set<T>().Where(whereLambda).Count();
72             if (isAsc)
73             {
74                 var iQueryList = db.Set<T>().Where(whereLambda).OrderBy(orderLambda)
75                    .Skip((pageIndex - 1) * pageSize).Take(pageSize);
76 
77                 list = iQueryList.ToList();
78             }
79             else
80             {
81                 var iQueryList = db.Set<T>().Where(whereLambda).OrderByDescending(orderLambda)
82                  .Skip((pageIndex - 1) * pageSize).Take(pageSize);
83                 list = iQueryList.ToList();
84             }
85             rowCount = count;
86             return list;
87         }

复制代码

(4). 修改

复制代码

  1         /// <summary>2         /// 修改3         /// </summary>4         /// <param name="model">修改后的实体</param>5         /// <returns></returns>6         public int Modify(T model)7         {8             db.Entry(model).State = EntityState.Modified;9             return db.SaveChanges();10         }11 12         /// <summary>13         /// 单实体扩展修改(把不需要修改的列用LAMBDA数组表示出来)14         /// </summary>15         /// <param name="model">要修改的实体对象</param>16         /// <param name="ignoreProperties">不须要修改的相关字段</param>17         /// <returns>受影响的行数</returns>18         public int Modify(T model, params Expression<Func<T, object>>[] ignoreProperties)19         {20             using (DbContext db = new DBContextFactory().GetDbContext())21             {22                 db.Set<T>().Attach(model);23 24                 DbEntityEntry entry = db.Entry<T>(model);25                 entry.State = EntityState.Unchanged;26 27                 Type t = typeof(T);28                 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();29 30                 Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();31                 proInfos.ForEach(32                     p => dicPros.Add(p.Name, p)33                     );34 35                 if (ignoreProperties != null)36                 {37                     foreach (var ignorePropertyExpression in ignoreProperties)38                     {39                         //根据表达式得到对应的字段信息40                         var ignorePropertyName = new PropertyExpressionParser<T>(ignorePropertyExpression).Name;41                         dicPros.Remove(ignorePropertyName);42                     }43                 }44 45                 foreach (string proName in dicPros.Keys)46                 {47                     entry.Property(proName).IsModified = true;48                 }49                 return db.SaveChanges();50             }51         }52 53         /// <summary>54         /// 批量修改(非lambda)55         /// </summary>56         /// <param name="model">要修改实体中 修改后的属性 </param>57         /// <param name="whereLambda">查询实体的条件</param>58         /// <param name="proNames">lambda的形式表示要修改的实体属性名</param>59         /// <returns></returns>60         public int ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params string[] proNames)61         {62             List<T> listModifes = db.Set<T>().Where(whereLambda).ToList();63             Type t = typeof(T);64             List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();65             Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();66             proInfos.ForEach(p =>67             {68                 if (proNames.Contains(p.Name))69                 {70                     dicPros.Add(p.Name, p);71                 }72             });73             foreach (string proName in proNames)74             {75                 if (dicPros.ContainsKey(proName))76                 {77                     PropertyInfo proInfo = dicPros[proName];78                     object newValue = proInfo.GetValue(model, null);79                     foreach (T m in listModifes)80                     {81                         proInfo.SetValue(m, newValue, null);82                     }83                 }84             }85             return db.SaveChanges();86         }87 88         /// <summary>89         /// 批量修改(支持lambda)90         /// </summary>91         /// <param name="model">要修改实体中 修改后的属性 </param>92         /// <param name="whereLambda">查询实体的条件</param>93         /// <param name="proNames">lambda的形式表示要修改的实体属性名</param>94         /// <returns></returns>95         public int ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params Expression<Func<T, object>>[] proNames)96         {97             List<T> listModifes = db.Set<T>().Where(whereLambda).ToList();98             Type t = typeof(T);99             List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
100             Dictionary<string, PropertyInfo> dicPros = new Dictionary<string, PropertyInfo>();
101             if (proNames != null)
102             {
103                 foreach (var myProperyExp in proNames)
104                 {
105                     var my_ProName = new PropertyExpressionParser<T>(myProperyExp).Name;
106                     proInfos.ForEach(p =>
107                     {
108                         if (p.Name.Equals(my_ProName))
109                         {
110                             dicPros.Add(p.Name, p);
111                         }
112                     });
113                     if (dicPros.ContainsKey(my_ProName))
114                     {
115                         PropertyInfo proInfo = dicPros[my_ProName];
116                         object newValue = proInfo.GetValue(model, null);
117                         foreach (T m in listModifes)
118                         {
119                             proInfo.SetValue(m, newValue, null);
120                         }
121                     }
122                 }
123             }
124             return db.SaveChanges();
125         }
126    

复制代码

3. EF增删改封装(事务分离)

 (1). 事务批量处理

复制代码

1         /// <summary>
2         /// 事务批量处理
3         /// </summary>
4         /// <returns></returns>
5         public int SaveChange()
6         {
7             return db.SaveChanges();
8         }

复制代码

(2). 新增

复制代码

1         /// <summary>
2         /// 新增
3         /// </summary>
4         /// <param name="model">需要新增的实体</param>
5         public void AddNo(T model)
6         {
7             db.Set<T>().Add(model);
8         }

复制代码

(3). 修改

复制代码

1         /// <summary>
2         /// 修改
3         /// </summary>
4         /// <param name="model">修改后的实体</param>
5         public void ModifyNo(T model)
6         {
7             db.Entry(model).State = EntityState.Modified;
8         }

复制代码

(4). 删除

复制代码

        /// <summary>/// 删除/// </summary>/// <param name="model">需要删除的实体</param>public void DelNo(T model){db.Entry(model).State = EntityState.Deleted;}/// <summary>/// 条件删除/// </summary>/// <param name="delWhere">需要删除的条件</param>public void DelByNo(Expression<Func<T, bool>> delWhere){List<T> listDels = db.Set<T>().Where(delWhere).ToList();listDels.ForEach(d =>{db.Set<T>().Attach(d);db.Set<T>().Remove(d);});}

复制代码

4. Z.EntityFramework.Extensions 插件封装

方案一:在使用EF事务分离的方法的前提下,单独调用提交方法

复制代码

1         /// <summary>
2         /// 事务提交,速度约为saveChange的10倍-15倍
3         /// </summary>
4         public void BulkSaveChanges()
5         {
6             db.BulkSaveChanges();
7         }

复制代码

方案二:插件特有的增删改方法

复制代码

        /// <summary>/// 新增/// </summary>/// <param name="model">新增的实体集合</param>public void BulkInsert(List<T> model){db.BulkInsert<T>(model);}/// <summary>/// 删除/// </summary>/// <param name="model">需要删除的实体集合</param>public void BulkDelete(List<T> model){db.BulkDelete<T>(model);}/// <summary>/// 根据条件删除/// </summary>/// <param name="delWhere">删除条件</param>public void BulkDeleteBy(Expression<Func<T, bool>> delWhere){List<T> listDels = db.Set<T>().Where(delWhere).ToList();db.BulkDelete<T>(listDels);}/// <summary>/// 需要修改的实体集合/// </summary>/// <param name="model"></param>public void BulkUpdate(List<T> model){db.BulkUpdate<T>(model);}

复制代码

 

 

  未完,后续会不断更新。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

115网盘linux 下载速度慢,linux vps 上 下载115网盘 的方法

大多数童鞋买的vps都是只支持linux系统的&#xff0c;因为版权的问题&#xff0c;windows系统的vps价格上面要贵一些。但是&#xff0c;遇到要下载网盘文件时&#xff0c;没有装桌面只有shell的linux vps就表示压力大了&#xff0c;幸好LV发现一个Linux vps下载115网盘的方法&a…

第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)

一. 理解并发机制 1. 什么是并发&#xff0c;并发与多线程有什么关系&#xff1f; ①. 先从广义上来说&#xff0c;或者从实际场景上来说. 高并发通常是海量用户同时访问(比如&#xff1a;12306买票、淘宝的双十一抢购)&#xff0c;如果把一个用户看做一个线程的话那么并发可…

第二十一节:ADO层次上的海量数据处理方案(SqlBulkCopy类插入和更新)

一. 简介 1. 背景&#xff1a; 虽然前面EF的扩展插件Z.EntityFramework.Extensions&#xff0c;性能很快&#xff0c;而且也很方便&#xff0c;但是该插件要收费&#xff0c;使用免费版本的话&#xff0c;需要定期更新&#xff0c;如果不更新&#xff0c;将失效&#xff0c;非…

第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

一. 基本概念 1.共享锁&#xff1a;(holdlock) (1). select的时候会自动加上共享锁&#xff0c;该条语句执行完&#xff0c;共享锁立即释放&#xff0c;与事务是否提交没有关系。 (2). 显式通过添加(holdlock)来显式添加共享锁&#xff08;比如给select语句显式添加共享锁&…

r语言中1c0怎么表示什么,r语言表示或者用什么符号?

犯罪嫌疑人X1、对象名称中的句点(.)没有特殊意义。但美元符号($)却有着和其他语言中的句点类似的含义&#xff0c;即指定一个对象中的某些部分例如&#xff1a;(1)A$x是指数据框A中的变量x。(2)lm.x 指一个变量&#xff0c;lm$x则指对象lm的一个属性。2、 R不提供多行注释或块注…

第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

一. 开篇说明 EF的性能问题一直以来经常被人所吐槽&#xff0c;究其原因在于“复杂的操作在生成SQL阶段耗时长&#xff0c;且执行效率不高”&#xff0c;但并不是没有办法解决&#xff0c;从EF本身举几个简单的优化例子&#xff1a; ①&#xff1a;如果仅是查询数据&#xff0c…

c语言怎样计算栈的长度,数据结构与算法:栈 C语言实现

栈是仅在表尾进行插入、删除操作的线性表。即栈 S (a1, a2, a3, ………,an-1, an)&#xff0c;其中表尾称为栈顶 /top&#xff0c;表头称为栈底/base。由于只能在表尾进行操作&#xff0c;因此栈的运算规则就是“后进先出”(LIFO)和线性表类似&#xff0c;栈也有两种存储结构—…

WebApi系列(从.Net 到 .Net Core)【更新】

一. 简介 1. 什么是WebApi&#xff1f; WebApi是一个很广泛的概念&#xff0c;在这里我们特指.Net平台下的Asp.Net WebApi框架&#xff0c;它是针对各种客户端(浏览器、APP等)来构建Http服务的一个框架&#xff0c;它是一种RestFul风格的开发接口的技术&#xff0c;它比WebServ…

第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍

一. 原生态接口 1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中&#xff0c;我们可以看到默认路由如下&#xff1a; 分析&#xff1a;请求地址在 controller 前面需要加上 api/&#xff0c;controller后面没有action&#xff0c;最后有一个参数{id}&#xff0c…

第二节:如何正确使用WebApi和使用过程中的一些坑

一. 基本调用规则 1. 前提 WebApi的默认路由规则为&#xff1a;routeTemplate: "api/{controller}/{id}", 下面为我们统一将它改为 routeTemplate: "api/{controller}/{action}/{id}",这样我们在调用的时候&#xff0c;还是通过拼接方法名来识别&#xff0…

第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

一. 前言 前端调用有Form表单提交&#xff0c;ajax提交&#xff0c;ajax一般是用Jquery的简化写法&#xff0c;在这里不再过多介绍&#xff1b; 后端调用大约有这些&#xff1a;WebCient、WebRequest、Httpclient、WebapiClient&#xff0c;重点探讨Get和Post请求&#xff0c;P…

android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感

Android代码----传感器-----测试手机支持那几种传感一个小小Demo检测手机支持那几种传感&#xff1a;具体代码如下&#xff1a;[Java代码]DemoSensorActivity.javapackage com.example.testsensor;import java.util.List;import android.app.Activity;import android.content.C…

第四节:跨域请求的解决方案和WebApi特有的处理方式

一. 简介 前言&#xff1a; 跨域问题发生在Javascript发起Ajax调用&#xff0c;其根本原因是因为浏览器对于这种请求&#xff0c;所给予的权限是较低的&#xff0c;通常只允许调用本域中的资源&#xff0c; 除非目标服务器明确地告知它允许跨域调用。假设我们页面或者应用已在 …

手机存储android文件怎么打开,安卓手机如何打开.jio文件?

01安卓手机无法打开.jio文件&#xff0c;需要在电脑上安装久其通用数据管理平台软件打开。进入软件首页&#xff0c;点击菜单栏“装入”按钮&#xff0c;弹出“数据装入向然后导”&#xff0c;单击文件夹图标&#xff0c;在弹出“打开”窗口中选择装入数据的路径&#xff0c;单…

第五节:WebApi的三大过滤器

一. 基本说明 1. 简介&#xff1a; WebApi下的过滤器和MVC下的过滤器有一些区别,首先我们要注意的是通常建WebApi项目时&#xff0c;会自动把MVC的程序集也引入进来&#xff0c;所以我们在使用WebApi下的过滤器的时候&#xff0c;要引入“ System.Web.Http”这个程序集&#x…

android动态贴纸实现原理,人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现...

原标题&#xff1a;人脸动态贴纸sdk算法详解&#xff0c;人脸动态贴纸功能如何实现泛娱乐行业在互联网领域中发展趋势逐渐增强&#xff0c;而直播、短视频、视频社交等作为头部产品受到了众多用户的关注和喜爱。为了能够更好的满足用户体验&#xff0c;众多APP纷纷开始接入人脸…

第六节:WebApi的部署方式(自托管)

一. 简单说明 开篇就介绍过WebApi和MVC相比&#xff0c;其中优势之一就是WebApi可以不依赖于IIS部署&#xff0c;可以自托管&#xff0c;当然这里指的是 .Net FrameWork 下的 WebApi 和 MVC 相比较&#xff0c;在.Net Core下&#xff0c;当然就另行别论。 下面我们重点介绍的就…

第七节:WebApi与Unity整合进行依赖注入和AOP的实现

一. IOC和DI 1. 通过Nuget引入Unity程序集。 PS:【版本&#xff1a;5.8.6】 2. 新建DIFactory类&#xff0c;用来读取Unity的配置文件并创建Unity容器&#xff0c;需要注意的是DIFactory类需要声明成单例。 PS&#xff1a;这里采用静态构造函数(必须是无参的)的形式来实现单…

第八节:常见安全隐患和传统的基于Session和Token的安全校验

一. 常见的安全隐患 1. SQL注入 常见的案例&#xff1a; String query "SELECT * FROM T_User WHERE userID" Request["userID"] "; 这个时候&#xff0c;只需要在传递过来的userID后面加上个&#xff1a; or 11&#xff0c;即可以获取T_User表中…

android手机设置时间设置,如何设置电信定制手机日期与时间

使用电信定制手机如A765e、A600e、A560e等的时候&#xff0c;可能会发现手机的日期和时间没法自己设置。这主要是因为手机使用电信卡时&#xff0c;会自动与电信基站进行交互并自动调节日期与时间。所以不论使用电信定制的单模或双模手机(单模是指手机只有一个卡槽&#xff0c;…