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. Best Practices for Performance_3.Improving Layout Performance 优化布局

    http://developer.android.com/training/improving-layouts/index.html 1. 优化布局层次 1)  每增加一个View或者布局,都会增加额 ...

  2. javascript基础部分

    javascript基础部分 1  数据类型: 基础数据类型(通过typeof来检测):Number,string,undefined,null,boolean,function typeof只能检测 ...

  3. 序列化Image到byte[]

    using System.Runtime.Serialization.Formatters.Binary; //引入供序列化Image对象使用 /// <summary>/// 将byte ...

  4. Solr导入MySql中的数据

    1.参照 http://www.cnblogs.com/luxh/p/5016894.html 部署好solr的环境 2.在solr_home下建立一个core_item目录 [root@iZ23ex ...

  5. sqlserver ,left join 不仅可以join表,还可以是一个结果集

    SELECT MA.NAME AS MakeName , M.ID AS ModelId , M.Name AS ModelName , M.Warranty AS ModelWarranty , S ...

  6. 从主机访问虚拟机上的Apache

    问题:VMWARE上安装的CentOS6.4,安装Apache,启动后,虚拟机上能访问,主机能ping通,但无法访问Apache. 原因:防火墙设置,配置iptables,开放apache的端口80

  7. Webpack 入门指南 - 1.安装

    Webpack 是目前流行的打包工具,如何安装它呢? 1. 安装 Node Js 首先,Webpack 是基于 NodeJs 的工具,你必须首先安装 NodeJs. NodeJs 仅仅只需要在你的系统 ...

  8. 哈夫曼树---POJ3253

    http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出 ...

  9. range for query

    static void range_test(Args _args) { Query                   Query; QueryRun                QueryRun ...

  10. 《从零开始做一个MEAN全栈项目》(2)

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习.   上一节简单介绍了什么是MEAN全栈项目,这一节将简要介绍三个内容:(1)一个通用的MEAN项目的技 ...