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 ...
随机推荐
- Keep-Alive 总结
一.简介 Keep-Alive是http请求头信息中的一个配置参数,开启之后俗称保持HTTP长连接,HTTP 1.0和HTTP 1.1都支持,HTTP1.0中该属性默认是关闭的,可在头信息中配置开启( ...
- 线程Thread,有参数和参数
一.不带参数的 using System; using System.Collections.Generic; using System.Text; using System.Threading; n ...
- phpstrom 10 激活
随着 JetBrains 新版本的发布,注册机已然不行了.然而,道高一尺,魔高一丈.IntelliJ IDEA开源社区 提供了如下通用激活方法:注册时选择License server填写http:// ...
- Visual Studio最好用的快捷键
当然每个人常用的一般都会有些不一样,欢迎大家评论说出自己常用或最常用的快捷键吧,比比看谁用的巧~~~ ctrl+-(shift+ctrl+-):移动光标到上次位置或相反,比如定位一个函数,转到函数定义 ...
- (Array)121. Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- U盘快捷方式中毒处理办法
这是网上某位大神的,对于我这个U盘总中毒的人真的很好用,太开心啦啦 http://blog.csdn.net/jzwong/article/details/51002568
- Oracle去掉字符串首尾
今天刚注册博客,与大家分享一下今天的新的: 今天在报表中碰到这样一个需求,数据库里面的一个字段是其他的3个字段合成的,但是现在读取数据只要中间的那一部分, 思考了许久这个字段的中间部分不是固定的,头和 ...
- hyper-v虚拟化管理
一. 什么是Hyper-V? Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术. Hyper-V ...
- JS数组push会覆盖前面的数据问题
这是一个作用域和重新赋值的问题. 检查声明数组所在位置,特别在是多层嵌套中,检查是否在内层循环结束时 跳到外层循环就重新将 数组 赋值为空.
- 可变参数宏__VA_ARGS__和...
__VA_ARGS__ 是一个可变参数的宏(gcc支持).实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点).这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所 ...