1 using System;
2 using System.Data;
3 using System.Collections.Generic;
4 using System.Data.Entity;
5 using System.Linq;
6 using System.Linq.Expressions;
7 using System.Text;
8 using System.Threading.Tasks;
9 using SchoolDAL.Context;
10 using SchoolDAL.Entity;
11 using System.Data.Entity.Infrastructure;
12 using System.Data.SqlClient;
13 using EntityFramework.Extensions;
14 using System.Reflection;
15 namespace SchoolDAL
16 {
17
18 public class BaseDAL
19 {
20
21 public DbContext Context;
22
23 public BaseDAL(DbContext context)
24 {
25 Context = context;
26 }
//得到实体的数量 根据条件
27 public int GetModelCount<TEntity>(Expression<Func<TEntity, bool>> filterList) where TEntity : class
28 {
29 return FindByItem(filterList).Count();
30 }
31 //根据单个条件得到实体的集合
32 public List<TEntity> FindModelList<TEntity>(Expression<Func<TEntity, bool>> filterList,int currPage,int size,out int Total) where TEntity : class
33 {
34 List<TEntity> list=new List<TEntity>();
35 var json = FindByItem(filterList);
36 try
37 {
38 Total = json.Count();
39 list = json.Skip(currPage).Take(size).ToList();// only support order by Id asc
40 }
41 catch
42 {
43 Total = 0;
44 }
45 return list;
46 }
47 //根据条件得到集合
48 public TEntity FindModel<TEntity>(Expression<Func<TEntity, bool>> filterList) where TEntity : class
49 {
50 return FindByItem(filterList).FirstOrDefault();
51 }
52 //根据多个条件得到实体数据源
53 public IQueryable<TEntity> FindByItem<TEntity>(List<Expression<Func<TEntity, bool>>> filterList) where TEntity : class
54 {
55 var json = Context.Set<TEntity>().Where(t => true);
56 foreach (var item in filterList)
57 {
58 json = json.Where(item);
59 }
60 return json;
61 }
62 //根据单个条件得到数据源
63 public IQueryable<TEntity> FindByItem<TEntity>(Expression<Func<TEntity, bool>> filterList) where TEntity : class
64 {
65 var json = Context.Set<TEntity>().Where(filterList);
66
67 return json;
68 }
69 //单个增加
70 public bool Create<TEntity>(TEntity TObject) where TEntity : class
71 {
72 try
73 {
74 Context.Set<TEntity>().Add(TObject);
75 Context.SaveChanges();
76 return true;
77 }
78 catch (Exception ex)
79 {
80 return false;
81 }
82 }
83 //单个修改
84 public bool Edit<TEntity>(TEntity TObject) where TEntity : class
85 {
86 try
87 {
88 var entry = Context.Entry(TObject);
89 Context.Set<TEntity>().Attach(TObject);
90 entry.State = EntityState.Modified;
91 Context.SaveChanges();
92 return true;
93 }
94 catch
95 {
96 //throw ex;
97 return false;
98 }
99 }
100 //单个删除
101 public void Delete<TEntity>(TEntity TObject) where TEntity : class
102 {
103 try
104 {
105 Context.Set<TEntity>().Remove(TObject);
106 Context.SaveChanges();
107
108 }
109 catch (Exception ex)
110 {
111
112 }
113
114 }
115
116 //批量修改
117 public int BulkUpdate<TEntity>(List<Expression<Func<TEntity, bool>>> filterList, Expression<Func<TEntity, TEntity>> UpdatedModel) where TEntity : class
118 {
119 int res = 0;
120 var json = FindByItem(filterList);
121 using (var tran = Context.Database.BeginTransaction())
122 {
123 try
124 {
125 res = Context.Set<TEntity>().Update(json, UpdatedModel);
126 tran.Commit();
127 }
128 catch
129 {
130 tran.Rollback();
131 }
132 }
133 return res;
134 }
135 //批量删除
136 public int BulkDelete<TEntity>(List<Expression<Func<TEntity, bool>>> filterList) where TEntity : class
137 {
138 int res=0;
139 var json = FindByItem(filterList);
140 using(var tran= Context.Database.BeginTransaction())
141 {
142 try
143 {
144 res= Context.Set<TEntity>().Delete(json);
145 tran.Commit();
146 }
147 catch
148 {
149 tran.Rollback();
150 }
151 }
152 return res;
153
154 }
155 //批量创建
156 public void BulkCreate<TEntity>(List<TEntity> list,string tableName) where TEntity : class
157 {
158
159 DataTable dt = new DataTable();
160 Type type = typeof(TEntity);
161 PropertyInfo[] propes = type.GetProperties();
162 foreach (var prop in propes)
163 {
164 dt.Columns.Add(prop.Name);
165 }
166 foreach (var entity in list)
167 {
168 DataRow row = dt.NewRow();
169 foreach (DataColumn col in dt.Columns)
170 {
171 foreach (var prop in propes)
172 {
173 if (!col.ColumnName.Equals("id", StringComparison.InvariantCultureIgnoreCase))
174 {
175 if (prop.Name.Equals(col.ColumnName, StringComparison.InvariantCultureIgnoreCase))
176 row[col.ColumnName] = prop.GetValue(entity);
177 }
178 }
179
180 }
181 dt.Rows.Add(row);
182 }
183 if (dt != null && dt.Rows.Count > 0)
184 {
185 using (var tran = Context.BeginTransaction())
186 {
187 try
188 {
189 using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(Context.Database.Connection.ConnectionString))
190 {
191 sqlBulkCopy.BatchSize = 10000;
192 sqlBulkCopy.BulkCopyTimeout = 12000;
193 sqlBulkCopy.DestinationTableName = string.Format("dbo.{0}", tableName);
196 for (int i = 1; i < dt.Columns.Count; i++)
197 {
198 sqlBulkCopy.ColumnMappings.Add(i, i);
199 }
201 sqlBulkCopy.WriteToServer(dt);
202 tran.Commit();
203 }
204 }
205 catch (Exception e)
206 {
207 tran.Rollback();
208 }
209 }
210
211 }
212
213 }
214
215 public SchoolContext GetContext()
216 {
217 return new SchoolContext();
218 }
219
220 public void DisposeContext(SchoolContext db)
221 {
222 if (db != null)
223 db.Dispose();
224 }
225 //绑定实体
226 public DbEntityEntry<TEntity> EditEntry<TEntity>(TEntity TObject) where TEntity : class
227 {
228 var entry = Context.Entry(TObject);
229 Context.Set<TEntity>().Attach(TObject);
230 entry.State = EntityState.Modified;
231 return entry;
232 }
233 //执行存储过程
234 public List<TEntity> ExecuteByStoreProcedure<TEntity>(string ExecuteProcedure,SqlParameter[] parms) where TEntity : class
235 {
236 List<SqlParameter> parmList = new List<SqlParameter>();
237
245 var list = Context.Database.SqlQuery<TEntity>(ExecuteProcedure, parms);
246 var enityList = list.ToList();
247
248 return enityList;
249
250 }
251
252 }
253 }

  

上面方法包括常见的增删改查,多条件查询,批量删除和修改,以及对存储过程的支持。其中BulkDelete 和BulkUpdate 依赖于EntityFramework.Extensions的类库,这个类库必须通过Nuget安装 链接地址:https://www.nuget.org/packages/EntityFramework.Extended 注意你的Ef版本。

EF 底层基础方法的更多相关文章

  1. EF 底层封装方法(供参考)

    闲暇之余,整理了一下EF底层的一些基础方法,供查看,只有接口,具体实现需要你们自己写了. 建议:接口的实现定义为虚方法,当父类的方法不满住子类需求时,可以重写此方法 此接口都为公用方法,基本上满足小系 ...

  2. 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输

    主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...

  3. Java底层基础题

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过Dispatche ...

  4. YARN底层基础库

      YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...

  5. 通过底层AVR方法实现SPI数据传输

    主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...

  6. 改善EF代码的方法(下)

    本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...

  7. 在同一个Apache服务器软件上部署多个站点的基础方法

    这篇文章主要介绍了Apache中Virtual Host虚拟主机配置及rewrite模块中的重要参数说明,是在同一个Apache服务器软件上部署多个站点的基础方法,需要的朋友可以参考下(http:// ...

  8. CodeBlocks(17.12) 代码调试基础方法&快捷方式

    转载:CodeBlocks(17.12) 代码调试基础方法&快捷方式: https://www.cnblogs.com/DCD112358/p/8998053.html

  9. Python_Mix*re模块基础方法,进阶,正则表达式的使用

    re模块import re 基础方法 findall:匹配所有 ,每一项都是列表中的一个元素,返回的是列表 search只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的gro ...

随机推荐

  1. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  2. [译]How to Install Node.js on Ubuntu 14.04 如何在ubuntu14.04上安装node.js

    原文链接为 http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/ 由作者Jacob Nicholson 发表于October ...

  3. NHibernate Demo 和 效率测试

    本文关于NHibernate的Demo和效率测试,希望对大家有用. 1.先去官网下载Nhibernate 2.放入到项目中并建立Helper类 private static ISession _Ses ...

  4. [MySQL] 高可用架构MMM简单介绍

    一.来源及原理: 众所周知,MySQL自身提供了AB复制(主从复制),然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库. 这样就实现了MySQ ...

  5. php 构造函数格式,具体该怎么写?应该注意什么呢?

    在PHP里,如果你没有手写构造函数,则php在实例化这个对象的时候,会自动为类成员以及类方法进行初始化,分配内存等工作,但是有些时候不能满足我们的要求,比如我们要在对象实例化的时候传递参数,那么就需要 ...

  6. boost timer 定时器 Operation cancel !

    前面段时间处理一个定时器时,老是提示 操作取消. 硬是没搞明白为什么! 其实我遇到的这个情况很简单就是(boost::asio::deadline_timer timer)这个变量的生命同期结束了,对 ...

  7. css3画三角形的原理

    以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...

  8. 一键配置openvpn

    页面:https://github.com/Nyr/openvpn-install openvpn-install OpenVPN road warrior installer for Debian, ...

  9. Sorry, but the Android VPN API doesn’t currently allow TAP-based tunnels.

    Sorry, but the Android VPN API doesn’t currently allow TAP-based tunnels. Edit .ovpn configfile “dev ...

  10. 在Excel中将数字转换为大写

    123.09 = 壹佰贰拾叁元零玖分 =SUBSTITUTE(SUBSTITUTE(IF(G10<0,"負","")&TEXT(TRUNC(ABS ...