EF 底层基础方法
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 底层基础方法的更多相关文章
- EF 底层封装方法(供参考)
闲暇之余,整理了一下EF底层的一些基础方法,供查看,只有接口,具体实现需要你们自己写了. 建议:接口的实现定义为虚方法,当父类的方法不满住子类需求时,可以重写此方法 此接口都为公用方法,基本上满足小系 ...
- 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输
主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...
- Java底层基础题
一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过Dispatche ...
- YARN底层基础库
YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...
- 通过底层AVR方法实现SPI数据传输
主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...
- 改善EF代码的方法(下)
本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...
- 在同一个Apache服务器软件上部署多个站点的基础方法
这篇文章主要介绍了Apache中Virtual Host虚拟主机配置及rewrite模块中的重要参数说明,是在同一个Apache服务器软件上部署多个站点的基础方法,需要的朋友可以参考下(http:// ...
- CodeBlocks(17.12) 代码调试基础方法&快捷方式
转载:CodeBlocks(17.12) 代码调试基础方法&快捷方式: https://www.cnblogs.com/DCD112358/p/8998053.html
- Python_Mix*re模块基础方法,进阶,正则表达式的使用
re模块import re 基础方法 findall:匹配所有 ,每一项都是列表中的一个元素,返回的是列表 search只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的gro ...
随机推荐
- div加边框
一.虚线与实线边框 边框虚线样式:dashed 边框实现样式:solid border:1px dashed #000 代表设置对象边框宽度为1px黑色虚线边框 border:1px solid #0 ...
- VMware10.06精简版安装后台运行
VMware10.06精简版安装时会出现一个安装功能选择菜单,里面有一条后台运行必选功能,一般人会跳过条.当你打算在服务器上用vmware时,一定要安装后台运行服务,否则你无法换出正在运行的后台虚拟机 ...
- RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
RT-Thread中使用线程这个概念,而不是任务.两者相似,我在这里把他的线程当作任务来理解了 1.任务处理: 动态任务相关API 创建任务:rt_thread_create函数,创建任务之后会返回r ...
- Node.js的循环与异步问题
(转自:http://bbs.tianya.cn/post-itinfo-280080-1.shtml) Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会 ...
- 如何用Jupyter Notebook打开Spark
电脑已经装了anaconda python,然后下载了spark2.1.0.因为版本太新,所以网上和书上的一些内容已经不再适用.比如关于如何使用IPython和Jupyter,教程给出的方法是用如下语 ...
- ODAC学习地址
http://www.cnblogs.com/ChinaEHR/p/4471920.html
- Hibernate使用
实现类: public class InfoDAOImpl extends BaseDao<Info> 1.List<Object[]> midlist=super.creat ...
- Burp SuiteBurp Suite使用详解
http://www.2cto.com/Article/201209/153312.html Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改 ...
- Jmeter beanshell 生成手机号加密签名
首先自己写一个根据手机号生成加密字符串的函数,并且导出为Jar包,函数具体内容省略,网上有很多 将Jar包放到Jmeter lib\ext目录下面,然后在user.properties里面把路径加进去 ...
- Android常用控件及对应Robotium API
最近发现Android控件不熟悉,看Robotium的API都费劲. 常用Android控件: 控件类型 描述 相关类 Button 按钮,可以被用户按下或点击,以执行⼀个动作 Button Text ...