【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase
索引
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
简述
今天我们写一个基础数据的操作类,如果里面有大家不理解的地方,可采取两种方式,第一:提出来,第二:会用就行。这个类呢我一般不去修改它,因为基础操作类,大家也可以直接拷贝到自己的项目中。
项目准备
我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。
项目开始
一、创建接口 IRepository
我们在应用服务的Service类库下面新建一个接口 IRepository
右击Service类库→添加→新建项→接口 名称 IRepository
二、基础操作的接口方法
不了解接口的朋友需要注意下,接口是个规范,是不需要方法体的,说的通俗点,有了接口如果被继承肯定会有实现,这里你只需要写方法就行了,具体的方法是如何实现的我们不管,爱怎么实现怎么实现,我只是告诉你,你要是继承我这个接口,那么我这些方法你必须实现,而且要符合我规范。这就跟领导一条批示:你给我做个上传图片的方法,返回上传成功或失败。领导就是接口,你是实现类,你在这个领导下面干活,就相当于你继承了领导,那么你必须要完成这个图片上传方法并且返回上传结果,至于你是用网上的上传方法呀还是自己写个webservice啊还是用jquery插件啊随你,领导不关心你用什么,他只关心你按照他的要求去实现这个方法。这样不知道大家理解接口了不?
我们这个接口是公共基础数据操作类,所以要有数据模型啊,模型说白了就是类,因为是通用的,所以我们这里写 T 并且标识 T 是个 Class
我们的Service类库呢,如果按照三层架构来讲,应该是数据管理层,既然是数据管理层,那么我们就是操作数据模型的,我们添加Domain 数据模型的引用,并且我们可能用到一些公共的方法,所以我们也添加对Common公共帮助类库的引用
上面我们讲了,这是数据管理层,我们是要对数据进行操作的,公用类库呢,我们提供多种数据管理的方式,我们再添加两个库引用 EntityFramework和EntityFramework.SqlServer
我们先来声明几个数据对象操作
下面,我们写几个接口方法
主要有 单模型操作 多模型操作 存储过程操作 查询多条数据 分页查询 ADO.NET增删改查
有朋友看到这会骂街了,我擦,能不能直接贴代码,截图干嘛~~ 不要急,不要急,一定要有耐心~~
我是先贴图,给大家有个大致的了解,代码肯定会贴出来的~~
单模型操作
1 #region 单模型操作 2 /// <summary> 3 /// 获取实体 4 /// </summary> 5 /// <param name="id">主键</param> 6 /// <returns>实体</returns> 7 T Get(Expression<Func<T, bool>> predicate); 8 /// <summary> 9 /// 插入实体 10 /// </summary> 11 /// <param name="entity">实体</param> 12 /// <returns>ID</returns> 13 bool Save(T entity); 14 15 /// <summary> 16 /// 修改实体 17 /// </summary> 18 /// <param name="entity">实体</param> 19 bool Update(T entity); 20 /// <summary> 21 /// 修改或保存实体 22 /// </summary> 23 /// <param name="entity">实体</param> 24 bool SaveOrUpdate(T entity, bool isEdit); 25 26 /// <summary> 27 /// 删除实体 28 /// </summary> 29 int Delete(Expression<Func<T, bool>> predicate = null); 30 31 /// <summary> 32 /// 执行SQL删除 33 /// </summary> 34 int DeleteBySql(string sql, params DbParameter[] para); 35 36 /// <summary> 37 /// 根据属性验证实体对象是否存在 38 /// </summary> 39 bool IsExist(Expression<Func<T, bool>> predicate); 40 41 /// <summary> 42 /// 根据SQL验证实体对象是否存在 43 /// </summary> 44 bool IsExist(string sql, params DbParameter[] para); 45 #endregion
多模型操作
1 #region 多模型操作 2 /// <summary> 3 /// 增加多模型数据,指定独立模型集合 4 /// </summary> 5 int SaveList<T1>(List<T1> t) where T1 : class; 6 /// <summary> 7 /// 增加多模型数据,与当前模型一致 8 /// </summary> 9 int SaveList(List<T> t); 10 /// <summary> 11 /// 更新多模型,指定独立模型集合 12 /// </summary> 13 int UpdateList<T1>(List<T1> t) where T1 : class; 14 /// <summary> 15 /// 更新多模型,与当前模型一致 16 /// </summary> 17 int UpdateList(List<T> t); 18 /// <summary> 19 /// 批量删除数据,当前模型 20 /// </summary> 21 int DeleteList(List<T> t); 22 /// <summary> 23 /// 批量删除数据,独立模型 24 /// </summary> 25 int DeleteList<T1>(List<T1> t) where T1 : class; 26 #endregion
存储过程操作
1 #region 存储过程操作 2 /// <summary> 3 /// 执行增删改存储过程 4 /// </summary> 5 object ExecuteProc(string procname, params DbParameter[] parameter); 6 /// <summary> 7 /// 执行查询的存储过程 8 /// </summary> 9 object ExecuteQueryProc(string procname, params DbParameter[] parameter); 10 #endregion
查询多条数据
1 #region 查询多条数据 2 /// <summary> 3 /// 获取集合 IQueryable 4 /// </summary> 5 IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate); 6 /// <summary> 7 /// 获取集合 IList 8 /// </summary> 9 List<T> LoadListAll(Expression<Func<T, bool>> predicate); 10 /// <summary> 11 /// 获取DbQuery的列表 12 /// </summary> 13 DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate); 14 /// <summary> 15 /// 获取IEnumerable列表 16 /// </summary> 17 IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para); 18 /// <summary> 19 /// 获取数据动态集合 20 /// </summary> 21 System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para); 22 /// <summary> 23 /// 采用SQL进行数据的查询,并转换 24 /// </summary> 25 List<T> SelectBySql(string sql, params DbParameter[] para); 26 List<T1> SelectBySql<T1>(string sql, params DbParameter[] para); 27 /// <summary> 28 /// 可指定返回结果、排序、查询条件的通用查询方法,返回实体对象 29 /// </summary> 30 /// <typeparam name="TEntity">实体对象</typeparam> 31 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 32 /// <typeparam name="TResult">数据结果,一般为object</typeparam> 33 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 34 /// <param name="orderby">排序字段</param> 35 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 36 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 37 /// <returns>实体集合</returns> 38 List<TResult> QueryEntity<TEntity, TOrderBy, TResult>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Expression<Func<TEntity, TResult>> selector, bool IsAsc) 39 where TEntity : class 40 where TResult : class; 41 /// <summary> 42 /// 可指定返回结果、排序、查询条件的通用查询方法,返回Object对象 43 /// </summary> 44 /// <typeparam name="TEntity">实体对象</typeparam> 45 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 46 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 47 /// <param name="orderby">排序字段</param> 48 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 49 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 50 /// <returns>自定义实体集合</returns> 51 List<object> QueryObject<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 52 where TEntity : class; 53 /// <summary> 54 /// 可指定返回结果、排序、查询条件的通用查询方法,返回动态类对象 55 /// </summary> 56 /// <typeparam name="TEntity">实体对象</typeparam> 57 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 58 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 59 /// <param name="orderby">排序字段</param> 60 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 61 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 62 /// <returns>动态类对象</returns> 63 dynamic QueryDynamic<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 64 where TEntity : class; 65 #endregion
分页查询
1 #region 分页查询 2 3 /// <summary> 4 /// 通过SQL分页 5 /// </summary> 6 /// <param name="sql"></param> 7 /// <param name="parameters"></param> 8 /// <param name="page"></param> 9 /// <returns></returns> 10 IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, PageCollection page); 11 IList<T> PageByListSql(string sql, IList<DbParameter> parameters, PageCollection page); 12 /// <summary> 13 /// 通用EF分页,默认显示20条记录 14 /// </summary> 15 /// <typeparam name="TEntity">实体模型</typeparam> 16 /// <typeparam name="TOrderBy">排序类型</typeparam> 17 /// <param name="index">当前页</param> 18 /// <param name="pageSize">显示条数</param> 19 /// <param name="where">过滤条件</param> 20 /// <param name="orderby">排序字段</param> 21 /// <param name="selector">结果集合</param> 22 /// <param name="isAsc">排序方向true正序 false倒序</param> 23 /// <returns>自定义实体集合</returns> 24 PageInfo<object> Query<TEntity, TOrderBy> 25 (int index, int pageSize, 26 Expression<Func<TEntity, bool>> where, 27 Expression<Func<TEntity, TOrderBy>> orderby, 28 Func<IQueryable<TEntity>, List<object>> selector, 29 bool IsAsc) 30 where TEntity : class; 31 /// <summary> 32 /// 对IQueryable对象进行分页逻辑处理,过滤、查询项、排序对IQueryable操作 33 /// </summary> 34 /// <param name="t">Iqueryable</param> 35 /// <param name="index">当前页</param> 36 /// <param name="PageSize">每页显示多少条</param> 37 /// <returns>当前IQueryable to List的对象</returns> 38 Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize); 39 /// <summary> 40 /// 普通SQL查询分页方法 41 /// </summary> 42 /// <param name="index">当前页</param> 43 /// <param name="pageSize">显示行数</param> 44 /// <param name="tableName">表名/视图</param> 45 /// <param name="field">获取项</param> 46 /// <param name="filter">过滤条件</param> 47 /// <param name="orderby">排序字段+排序方向</param> 48 /// <param name="group">分组字段</param> 49 /// <returns>结果集</returns> 50 Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para); 51 /// <summary> 52 /// 简单的Sql查询分页 53 /// </summary> 54 /// <param name="index"></param> 55 /// <param name="pageSize"></param> 56 /// <param name="sql"></param> 57 /// <returns></returns> 58 Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para); 59 /// <summary> 60 /// 多表联合分页算法 61 /// </summary> 62 PageInfo Query(IQueryable query, int index, int pagesize); 63 #endregion
ADO.NET增删改查
1 #region ADO.NET增删改查方法 2 /// <summary> 3 /// 执行增删改方法,含事务处理 4 /// </summary> 5 object ExecuteSqlCommand(string sql, params DbParameter[] para); 6 /// <summary> 7 /// 执行多条SQL,增删改方法,含事务处理 8 /// </summary> 9 object ExecuteSqlCommand(Dictionary<string, object> sqllist); 10 /// <summary> 11 /// 执行查询方法,返回动态类,接收使用var,遍历时使用dynamic类型 12 /// </summary> 13 object ExecuteSqlQuery(string sql, params DbParameter[] para); 14 #endregion
我们引用的类库和解决方案
1 using Common; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Common; 5 using System.Linq; 6 using System.Text; 7 using System.Data.Entity.Infrastructure; 8 using System.Data.Entity; 9 using System.Linq.Expressions;
这里是完整的IRepository.cs
1 using Common; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Common; 5 using System.Linq; 6 using System.Text; 7 using System.Data.Entity.Infrastructure; 8 using System.Data.Entity; 9 using System.Linq.Expressions; 10 11 namespace Service 12 { 13 /// <summary> 14 /// 所有的数据操作基类接口 15 /// add yuangang by 2016-05-09 16 /// </summary> 17 public interface IRepository<T> where T:class 18 { 19 #region 数据对象操作 20 /// <summary> 21 /// 数据上下文 22 /// </summary> 23 DbContext Context { get; } 24 /// <summary> 25 /// 数据上下文 26 /// </summary> 27 Domain.MyConfig Config { get; } 28 /// <summary> 29 /// 数据模型操作 30 /// </summary> 31 DbSet<T> dbSet { get; } 32 /// <summary> 33 /// EF事务 34 /// </summary> 35 DbContextTransaction Transaction { get; set; } 36 /// <summary> 37 /// 事务提交结果 38 /// </summary> 39 bool Committed { get; set; } 40 /// <summary> 41 /// 提交事务 42 /// </summary> 43 void Commit(); 44 /// <summary> 45 /// 回滚事务 46 /// </summary> 47 void Rollback(); 48 #endregion 49 50 #region 单模型操作 51 /// <summary> 52 /// 获取实体 53 /// </summary> 54 /// <param name="id">主键</param> 55 /// <returns>实体</returns> 56 T Get(Expression<Func<T, bool>> predicate); 57 /// <summary> 58 /// 插入实体 59 /// </summary> 60 /// <param name="entity">实体</param> 61 /// <returns>ID</returns> 62 bool Save(T entity); 63 64 /// <summary> 65 /// 修改实体 66 /// </summary> 67 /// <param name="entity">实体</param> 68 bool Update(T entity); 69 /// <summary> 70 /// 修改或保存实体 71 /// </summary> 72 /// <param name="entity">实体</param> 73 bool SaveOrUpdate(T entity, bool isEdit); 74 75 /// <summary> 76 /// 删除实体 77 /// </summary> 78 int Delete(Expression<Func<T, bool>> predicate = null); 79 80 /// <summary> 81 /// 执行SQL删除 82 /// </summary> 83 int DeleteBySql(string sql, params DbParameter[] para); 84 85 /// <summary> 86 /// 根据属性验证实体对象是否存在 87 /// </summary> 88 bool IsExist(Expression<Func<T, bool>> predicate); 89 90 /// <summary> 91 /// 根据SQL验证实体对象是否存在 92 /// </summary> 93 bool IsExist(string sql, params DbParameter[] para); 94 #endregion 95 96 #region 多模型操作 97 /// <summary> 98 /// 增加多模型数据,指定独立模型集合 99 /// </summary> 100 int SaveList<T1>(List<T1> t) where T1 : class; 101 /// <summary> 102 /// 增加多模型数据,与当前模型一致 103 /// </summary> 104 int SaveList(List<T> t); 105 /// <summary> 106 /// 更新多模型,指定独立模型集合 107 /// </summary> 108 int UpdateList<T1>(List<T1> t) where T1 : class; 109 /// <summary> 110 /// 更新多模型,与当前模型一致 111 /// </summary> 112 int UpdateList(List<T> t); 113 /// <summary> 114 /// 批量删除数据,当前模型 115 /// </summary> 116 int DeleteList(List<T> t); 117 /// <summary> 118 /// 批量删除数据,独立模型 119 /// </summary> 120 int DeleteList<T1>(List<T1> t) where T1 : class; 121 #endregion 122 123 #region 存储过程操作 124 /// <summary> 125 /// 执行增删改存储过程 126 /// </summary> 127 object ExecuteProc(string procname, params DbParameter[] parameter); 128 /// <summary> 129 /// 执行查询的存储过程 130 /// </summary> 131 object ExecuteQueryProc(string procname, params DbParameter[] parameter); 132 #endregion 133 134 #region 查询多条数据 135 /// <summary> 136 /// 获取集合 IQueryable 137 /// </summary> 138 IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate); 139 /// <summary> 140 /// 获取集合 IList 141 /// </summary> 142 List<T> LoadListAll(Expression<Func<T, bool>> predicate); 143 /// <summary> 144 /// 获取DbQuery的列表 145 /// </summary> 146 DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate); 147 /// <summary> 148 /// 获取IEnumerable列表 149 /// </summary> 150 IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para); 151 /// <summary> 152 /// 获取数据动态集合 153 /// </summary> 154 System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para); 155 /// <summary> 156 /// 采用SQL进行数据的查询,并转换 157 /// </summary> 158 List<T> SelectBySql(string sql, params DbParameter[] para); 159 List<T1> SelectBySql<T1>(string sql, params DbParameter[] para); 160 /// <summary> 161 /// 可指定返回结果、排序、查询条件的通用查询方法,返回实体对象 162 /// </summary> 163 /// <typeparam name="TEntity">实体对象</typeparam> 164 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 165 /// <typeparam name="TResult">数据结果,一般为object</typeparam> 166 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 167 /// <param name="orderby">排序字段</param> 168 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 169 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 170 /// <returns>实体集合</returns> 171 List<TResult> QueryEntity<TEntity, TOrderBy, TResult>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Expression<Func<TEntity, TResult>> selector, bool IsAsc) 172 where TEntity : class 173 where TResult : class; 174 /// <summary> 175 /// 可指定返回结果、排序、查询条件的通用查询方法,返回Object对象 176 /// </summary> 177 /// <typeparam name="TEntity">实体对象</typeparam> 178 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 179 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 180 /// <param name="orderby">排序字段</param> 181 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 182 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 183 /// <returns>自定义实体集合</returns> 184 List<object> QueryObject<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 185 where TEntity : class; 186 /// <summary> 187 /// 可指定返回结果、排序、查询条件的通用查询方法,返回动态类对象 188 /// </summary> 189 /// <typeparam name="TEntity">实体对象</typeparam> 190 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 191 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 192 /// <param name="orderby">排序字段</param> 193 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 194 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 195 /// <returns>动态类对象</returns> 196 dynamic QueryDynamic<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 197 where TEntity : class; 198 #endregion 199 200 #region 分页查询 201 202 /// <summary> 203 /// 通过SQL分页 204 /// </summary> 205 /// <param name="sql"></param> 206 /// <param name="parameters"></param> 207 /// <param name="page"></param> 208 /// <returns></returns> 209 IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, PageCollection page); 210 IList<T> PageByListSql(string sql, IList<DbParameter> parameters, PageCollection page); 211 /// <summary> 212 /// 通用EF分页,默认显示20条记录 213 /// </summary> 214 /// <typeparam name="TEntity">实体模型</typeparam> 215 /// <typeparam name="TOrderBy">排序类型</typeparam> 216 /// <param name="index">当前页</param> 217 /// <param name="pageSize">显示条数</param> 218 /// <param name="where">过滤条件</param> 219 /// <param name="orderby">排序字段</param> 220 /// <param name="selector">结果集合</param> 221 /// <param name="isAsc">排序方向true正序 false倒序</param> 222 /// <returns>自定义实体集合</returns> 223 PageInfo<object> Query<TEntity, TOrderBy> 224 (int index, int pageSize, 225 Expression<Func<TEntity, bool>> where, 226 Expression<Func<TEntity, TOrderBy>> orderby, 227 Func<IQueryable<TEntity>, List<object>> selector, 228 bool IsAsc) 229 where TEntity : class; 230 /// <summary> 231 /// 对IQueryable对象进行分页逻辑处理,过滤、查询项、排序对IQueryable操作 232 /// </summary> 233 /// <param name="t">Iqueryable</param> 234 /// <param name="index">当前页</param> 235 /// <param name="PageSize">每页显示多少条</param> 236 /// <returns>当前IQueryable to List的对象</returns> 237 Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize); 238 /// <summary> 239 /// 普通SQL查询分页方法 240 /// </summary> 241 /// <param name="index">当前页</param> 242 /// <param name="pageSize">显示行数</param> 243 /// <param name="tableName">表名/视图</param> 244 /// <param name="field">获取项</param> 245 /// <param name="filter">过滤条件</param> 246 /// <param name="orderby">排序字段+排序方向</param> 247 /// <param name="group">分组字段</param> 248 /// <returns>结果集</returns> 249 Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para); 250 /// <summary> 251 /// 简单的Sql查询分页 252 /// </summary> 253 /// <param name="index"></param> 254 /// <param name="pageSize"></param> 255 /// <param name="sql"></param> 256 /// <returns></returns> 257 Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para); 258 /// <summary> 259 /// 多表联合分页算法 260 /// </summary> 261 PageInfo Query(IQueryable query, int index, int pagesize); 262 #endregion 263 264 #region ADO.NET增删改查方法 265 /// <summary> 266 /// 执行增删改方法,含事务处理 267 /// </summary> 268 object ExecuteSqlCommand(string sql, params DbParameter[] para); 269 /// <summary> 270 /// 执行多条SQL,增删改方法,含事务处理 271 /// </summary> 272 object ExecuteSqlCommand(Dictionary<string, object> sqllist); 273 /// <summary> 274 /// 执行查询方法,返回动态类,接收使用var,遍历时使用dynamic类型 275 /// </summary> 276 object ExecuteSqlQuery(string sql, params DbParameter[] para); 277 #endregion 278 } 279 }
注意:在分页查询中,我们引用了Common公共类库的一个公共类 PageCollection.cs
这个类库在C#公共帮助类里面 连接:【C#公共帮助类】 分页逻辑处理类
三、基础操作的实现类
我们在Service类库下新建一个公共基础数据操作类 RepositoryBase.cs 继承接口 IRepository
因为这个实现类呢,东西比较多,如果没有什么问题,大家可以直接拿来用,鉴于时间的关系(还在上班,大家理解~~),我就直接把代码贴出来了,这篇文章写完不是结束,我会抽空再回来简单介绍一下这个实现类的一些方法和原理,同时,如果网友提出了问题或是整改,我也会回来整理修改。
固定公用帮助,含事务
1 #region 固定公用帮助,含事务 2 3 private DbContext context = new MyConfig().db; 4 /// <summary> 5 /// 数据上下文--->根据Domain实体模型名称进行更改 6 /// </summary> 7 public DbContext Context 8 { 9 get 10 { 11 context.Configuration.ValidateOnSaveEnabled = false; 12 return context; 13 } 14 } 15 /// <summary> 16 /// 数据上下文--->拓展属性 17 /// </summary> 18 public MyConfig Config 19 { 20 get 21 { 22 return new MyConfig(); 23 } 24 } 25 /// <summary> 26 /// 公用泛型处理属性 27 /// 注:所有泛型操作的基础 28 /// </summary> 29 public DbSet<T> dbSet 30 { 31 get { return this.Context.Set<T>(); } 32 } 33 /// <summary> 34 /// 事务 35 /// </summary> 36 private DbContextTransaction _transaction = null; 37 /// <summary> 38 /// 开始事务 39 /// </summary> 40 public DbContextTransaction Transaction 41 { 42 get 43 { 44 if (this._transaction == null) 45 { 46 this._transaction = this.Context.Database.BeginTransaction(); 47 } 48 return this._transaction; 49 } 50 set { this._transaction = value; } 51 } 52 /// <summary> 53 /// 事务状态 54 /// </summary> 55 public bool Committed { get; set; } 56 /// <summary> 57 /// 异步锁定 58 /// </summary> 59 private readonly object sync = new object(); 60 /// <summary> 61 /// 提交事务 62 /// </summary> 63 public void Commit() 64 { 65 if (!Committed) 66 { 67 lock (sync) 68 { 69 if (this._transaction != null) 70 _transaction.Commit(); 71 } 72 Committed = true; 73 } 74 } 75 /// <summary> 76 /// 回滚事务 77 /// </summary> 78 public void Rollback() 79 { 80 Committed = false; 81 if (this._transaction != null) 82 this._transaction.Rollback(); 83 } 84 #endregion
获取单条记录
1 #region 获取单条记录 2 /// <summary> 3 /// 通过lambda表达式获取一条记录p=>p.id==id 4 /// </summary> 5 public virtual T Get(Expression<Func<T, bool>> predicate) 6 { 7 try 8 { 9 return dbSet.AsNoTracking().SingleOrDefault(predicate); 10 } 11 catch (Exception e) 12 { 13 throw e; 14 } 15 } 16 #endregion
增删改操作
1 #region 增删改操作 2 3 /// <summary> 4 /// 添加一条模型记录,自动提交更改 5 /// </summary> 6 public virtual bool Save(T entity) 7 { 8 try 9 { 10 int row = 0; 11 var entry = this.Context.Entry<T>(entity); 12 entry.State = System.Data.Entity.EntityState.Added; 13 row = Context.SaveChanges(); 14 entry.State = System.Data.Entity.EntityState.Detached; 15 return row > 0; 16 } 17 catch (Exception e) 18 { 19 throw e; 20 } 21 22 } 23 24 /// <summary> 25 /// 更新一条模型记录,自动提交更改 26 /// </summary> 27 public virtual bool Update(T entity) 28 { 29 try 30 { 31 int rows = 0; 32 var entry = this.Context.Entry(entity); 33 entry.State = System.Data.Entity.EntityState.Modified; 34 rows = this.Context.SaveChanges(); 35 entry.State = System.Data.Entity.EntityState.Detached; 36 return rows > 0; 37 } 38 catch (Exception e) 39 { 40 throw e; 41 } 42 } 43 44 /// <summary> 45 /// 更新模型记录,如不存在进行添加操作 46 /// </summary> 47 public virtual bool SaveOrUpdate(T entity, bool isEdit) 48 { 49 try 50 { 51 return isEdit ? Update(entity) : Save(entity); 52 } 53 catch (Exception e) { throw e; } 54 } 55 56 /// <summary> 57 /// 删除一条或多条模型记录,含事务 58 /// </summary> 59 public virtual int Delete(Expression<Func<T, bool>> predicate = null) 60 { 61 try 62 { 63 int rows = 0; 64 IQueryable<T> entry = (predicate == null) ? this.dbSet.AsQueryable() : this.dbSet.Where(predicate); 65 List<T> list = entry.ToList(); 66 if (list.Count > 0) 67 { 68 for (int i = 0; i < list.Count; i++) 69 { 70 this.dbSet.Remove(list[i]); 71 } 72 rows = this.Context.SaveChanges(); 73 } 74 return rows; 75 } 76 catch (Exception e) 77 { 78 throw e; 79 } 80 } 81 /// <summary> 82 /// 使用原始SQL语句,含事务处理 83 /// </summary> 84 public virtual int DeleteBySql(string sql, params DbParameter[] para) 85 { 86 try 87 { 88 return this.Context.Database.ExecuteSqlCommand(sql, para); 89 } 90 catch (Exception e) 91 { 92 throw e; 93 } 94 } 95 #endregion
多模型操作
1 #region 多模型操作 2 3 /// <summary> 4 /// 增加多模型数据,指定独立模型集合 5 /// </summary> 6 public virtual int SaveList<T1>(List<T1> t) where T1 : class 7 { 8 try 9 { 10 if (t == null || t.Count == 0) return 0; 11 this.Context.Set<T1>().Local.Clear(); 12 foreach (var item in t) 13 { 14 this.Context.Set<T1>().Add(item); 15 } 16 return this.Context.SaveChanges(); 17 } 18 catch (Exception e) 19 { 20 throw e; 21 } 22 } 23 /// <summary> 24 /// 增加多模型数据,与当前模型一致 25 /// </summary> 26 public virtual int SaveList(List<T> t) 27 { 28 try 29 { 30 this.dbSet.Local.Clear(); 31 foreach (var item in t) 32 { 33 this.dbSet.Add(item); 34 } 35 return this.Context.SaveChanges(); 36 } 37 catch (Exception e) 38 { 39 throw e; 40 } 41 } 42 /// <summary> 43 /// 更新多模型,指定独立模型集合 44 /// </summary> 45 public virtual int UpdateList<T1>(List<T1> t) where T1 : class 46 { 47 if (t.Count <= 0) return 0; 48 try 49 { 50 foreach (var item in t) 51 { 52 this.Context.Entry<T1>(item).State = System.Data.Entity.EntityState.Modified; 53 } 54 return this.Context.SaveChanges(); 55 } 56 catch (Exception e) 57 { 58 throw e; 59 } 60 } 61 /// <summary> 62 /// 更新多模型,与当前模型一致 63 /// </summary> 64 public virtual int UpdateList(List<T> t) 65 { 66 if (t.Count <= 0) return 0; 67 try 68 { 69 foreach (var item in t) 70 { 71 this.Context.Entry(item).State = System.Data.Entity.EntityState.Modified; 72 } 73 return this.Context.SaveChanges(); 74 } 75 catch (Exception e) { throw e; } 76 } 77 /// <summary> 78 /// 批量删除数据,当前模型 79 /// </summary> 80 public virtual int DeleteList(List<T> t) 81 { 82 if (t == null || t.Count == 0) return 0; 83 foreach (var item in t) 84 { 85 this.dbSet.Remove(item); 86 } 87 return this.Context.SaveChanges(); 88 } 89 /// <summary> 90 /// 批量删除数据,自定义模型 91 /// </summary> 92 public virtual int DeleteList<T1>(List<T1> t) where T1 : class 93 { 94 try 95 { 96 if (t == null || t.Count == 0) return 0; 97 foreach (var item in t) 98 { 99 this.Context.Set<T1>().Remove(item); 100 } 101 return this.Context.SaveChanges(); 102 } 103 catch (Exception e) { throw e; } 104 } 105 #endregion
存储过程操作
1 #region 存储过程操作 2 /// <summary> 3 /// 执行返回影响行数的存储过程 4 /// </summary> 5 /// <param name="procname">过程名称</param> 6 /// <param name="parameter">参数对象</param> 7 /// <returns></returns> 8 public virtual object ExecuteProc(string procname, params DbParameter[] parameter) 9 { 10 try 11 { 12 return ExecuteSqlCommand(procname, parameter); 13 } 14 catch (Exception e) 15 { 16 throw e; 17 } 18 } 19 /// <summary> 20 /// 执行返回结果集的存储过程 21 /// </summary> 22 /// <param name="procname">过程名称</param> 23 /// <param name="parameter">参数对象</param> 24 /// <returns></returns> 25 public virtual object ExecuteQueryProc(string procname, params DbParameter[] parameter) 26 { 27 try 28 { 29 return this.Context.Database.SqlFunctionForDynamic(procname, parameter); 30 } 31 catch (Exception e) 32 { 33 throw e; 34 } 35 } 36 #endregion
存在验证操作
1 #region 存在验证操作 2 /// <summary> 3 /// 验证当前条件是否存在相同项 4 /// </summary> 5 public virtual bool IsExist(Expression<Func<T, bool>> predicate) 6 { 7 var entry = this.dbSet.Where(predicate); 8 return (entry.Any()); 9 } 10 11 /// <summary> 12 /// 根据SQL验证实体对象是否存在 13 /// </summary> 14 public virtual bool IsExist(string sql, params DbParameter[] para) 15 { 16 IEnumerable result = this.Context.Database.SqlQuery(typeof(int), sql, para); 17 18 if (result.GetEnumerator().Current == null || result.GetEnumerator().Current.ToString() == "0") 19 return false; 20 return true; 21 } 22 #endregion
获取多条数据操作
1 #region 获取多条数据操作 2 /// <summary> 3 /// 返回IQueryable集合,延时加载数据 4 /// </summary> 5 public virtual IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate) 6 { 7 try 8 { 9 if (predicate != null) 10 { 11 return this.dbSet.Where(predicate).AsNoTracking<T>(); 12 } 13 return this.dbSet.AsQueryable<T>().AsNoTracking<T>(); 14 } 15 catch (Exception e) 16 { 17 throw e; 18 } 19 } 20 /// <summary> 21 /// 返回DbQuery集合,延时加载数据 22 /// </summary> 23 public virtual DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate) 24 { 25 try 26 { 27 if (predicate != null) 28 { 29 return this.dbSet.Where(predicate) as DbQuery<T>; 30 } 31 return this.dbSet; 32 } 33 catch (Exception e) 34 { 35 throw e; 36 } 37 } 38 /// <summary> 39 /// 返回List集合,不采用延时加载 40 /// </summary> 41 public virtual List<T> LoadListAll(Expression<Func<T, bool>> predicate) 42 { 43 try 44 { 45 if (predicate != null) 46 { 47 return this.dbSet.Where(predicate).AsNoTracking().ToList(); 48 } 49 return this.dbSet.AsQueryable<T>().AsNoTracking().ToList(); 50 } 51 catch (Exception e) 52 { 53 throw e; 54 } 55 } 56 /// <summary> 57 /// 返回IEnumerable集合,采用原始T-Sql方式 58 /// </summary> 59 public virtual IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para) 60 { 61 try 62 { 63 return this.Context.Database.SqlQuery<T>(sql, para); 64 } 65 catch (Exception e) 66 { 67 throw e; 68 } 69 } 70 /// <summary> 71 /// 返回IEnumerable动态集合,采用原始T-Sql方式 72 /// </summary> 73 public virtual System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para) 74 { 75 try 76 { 77 return this.Context.Database.SqlQueryForDynamic(sql, para); 78 } 79 catch (Exception e) 80 { 81 throw e; 82 } 83 } 84 /// <summary> 85 /// 返回IList集合,采用原始T-Sql方式 86 /// </summary> 87 public virtual List<T> SelectBySql(string sql, params DbParameter[] para) 88 { 89 try 90 { 91 return this.Context.Database.SqlQuery(typeof(T), sql, para).Cast<T>().ToList(); 92 } 93 catch (Exception e) 94 { 95 throw e; 96 } 97 } 98 /// <summary> 99 /// 指定泛型,返回IList集合,采用原始T-Sql方式 100 /// </summary> 101 public virtual List<T1> SelectBySql<T1>(string sql, params DbParameter[] para) 102 { 103 try 104 { 105 return this.Context.Database.SqlQuery<T1>(sql, para).ToList(); 106 } 107 catch (Exception e) 108 { 109 throw e; 110 } 111 } 112 /// <summary> 113 /// 可指定返回结果、排序、查询条件的通用查询方法,返回实体对象 114 /// </summary> 115 /// <typeparam name="TEntity">实体对象</typeparam> 116 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 117 /// <typeparam name="TResult">数据结果,与TEntity一致</typeparam> 118 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 119 /// <param name="orderby">排序字段</param> 120 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 121 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 122 /// <returns>实体集合</returns> 123 public virtual List<TResult> QueryEntity<TEntity, TOrderBy, TResult> 124 (Expression<Func<TEntity, bool>> where, 125 Expression<Func<TEntity, TOrderBy>> orderby, 126 Expression<Func<TEntity, TResult>> selector, 127 bool IsAsc) 128 where TEntity : class 129 where TResult : class 130 { 131 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 132 if (where != null) 133 { 134 query = query.Where(where); 135 } 136 137 if (orderby != null) 138 { 139 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 140 } 141 if (selector == null) 142 { 143 return query.Cast<TResult>().AsNoTracking().ToList(); 144 } 145 return query.Select(selector).AsNoTracking().ToList(); 146 } 147 148 /// <summary> 149 /// 可指定返回结果、排序、查询条件的通用查询方法,返回Object对象 150 /// </summary> 151 /// <typeparam name="TEntity">实体对象</typeparam> 152 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 153 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 154 /// <param name="orderby">排序字段</param> 155 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 156 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 157 /// <returns>自定义实体集合</returns> 158 public virtual List<object> QueryObject<TEntity, TOrderBy> 159 (Expression<Func<TEntity, bool>> where, 160 Expression<Func<TEntity, TOrderBy>> orderby, 161 Func<IQueryable<TEntity>, 162 List<object>> selector, 163 bool IsAsc) 164 where TEntity : class 165 { 166 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 167 if (where != null) 168 { 169 query = query.Where(where); 170 } 171 172 if (orderby != null) 173 { 174 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 175 } 176 if (selector == null) 177 { 178 return query.AsNoTracking().ToList<object>(); 179 } 180 return selector(query); 181 } 182 183 /// <summary> 184 /// 可指定返回结果、排序、查询条件的通用查询方法,返回动态类对象 185 /// </summary> 186 /// <typeparam name="TEntity">实体对象</typeparam> 187 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 188 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 189 /// <param name="orderby">排序字段</param> 190 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 191 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 192 /// <returns>动态类</returns> 193 public virtual dynamic QueryDynamic<TEntity, TOrderBy> 194 (Expression<Func<TEntity, bool>> where, 195 Expression<Func<TEntity, TOrderBy>> orderby, 196 Func<IQueryable<TEntity>, 197 List<object>> selector, 198 bool IsAsc) 199 where TEntity : class 200 { 201 List<object> list = QueryObject<TEntity, TOrderBy> 202 (where, orderby, selector, IsAsc); 203 return Common.JsonConverter.JsonClass(list); 204 } 205 #endregion
分页操作
1 #region 分页操作 2 /// <summary> 3 /// 待自定义分页函数,使用必须重写,指定数据模型 4 /// </summary> 5 public virtual IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, Common.PageCollection page) 6 { 7 return null; 8 } 9 /// <summary> 10 /// 待自定义分页函数,使用必须重写, 11 /// </summary> 12 public virtual IList<T> PageByListSql(string sql, IList<DbParameter> parameters, Common.PageCollection page) 13 { 14 return null; 15 } 16 17 /// <summary> 18 /// 对IQueryable对象进行分页逻辑处理,过滤、查询项、排序对IQueryable操作 19 /// </summary> 20 /// <param name="t">Iqueryable</param> 21 /// <param name="index">当前页</param> 22 /// <param name="PageSize">每页显示多少条</param> 23 /// <returns>当前IQueryable to List的对象</returns> 24 public virtual Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize) 25 { 26 if (index < 1) 27 { 28 index = 1; 29 } 30 if (PageSize <= 0) 31 { 32 PageSize = 20; 33 } 34 int count = query.Count(); 35 36 int maxpage = count / PageSize; 37 38 if (count % PageSize > 0) 39 { 40 maxpage++; 41 } 42 if (index > maxpage) 43 { 44 index = maxpage; 45 } 46 if (count > 0) 47 query = query.Skip((index - 1) * PageSize).Take(PageSize); 48 return new Common.PageInfo<T>(index, PageSize, count, query.ToList()); 49 } 50 /// <summary> 51 /// 通用EF分页,默认显示20条记录 52 /// </summary> 53 /// <typeparam name="TEntity">实体模型</typeparam> 54 /// <typeparam name="TOrderBy">排序类型</typeparam> 55 /// <param name="index">当前页</param> 56 /// <param name="pageSize">显示条数</param> 57 /// <param name="where">过滤条件</param> 58 /// <param name="orderby">排序字段</param> 59 /// <param name="selector">结果集合</param> 60 /// <param name="isAsc">排序方向true正序 false倒序</param> 61 /// <returns>自定义实体集合</returns> 62 public virtual Common.PageInfo<object> Query<TEntity, TOrderBy> 63 (int index, int pageSize, 64 Expression<Func<TEntity, bool>> where, 65 Expression<Func<TEntity, TOrderBy>> orderby, 66 Func<IQueryable<TEntity>, 67 List<object>> selector, 68 bool isAsc) 69 where TEntity : class 70 { 71 if (index < 1) 72 { 73 index = 1; 74 } 75 76 if (pageSize <= 0) 77 { 78 pageSize = 20; 79 } 80 81 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 82 if (where != null) 83 { 84 query = query.Where(where); 85 } 86 int count = query.Count(); 87 88 int maxpage = count / pageSize; 89 90 if (count % pageSize > 0) 91 { 92 maxpage++; 93 } 94 if (index > maxpage) 95 { 96 index = maxpage; 97 } 98 99 if (orderby != null) 100 { 101 query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 102 } 103 if (count > 0) 104 query = query.Skip((index - 1) * pageSize).Take(pageSize); 105 //返回结果为null,返回所有字段 106 if (selector == null) 107 return new Common.PageInfo<object>(index, pageSize, count, query.ToList<object>()); 108 return new Common.PageInfo<object>(index, pageSize, count, selector(query).ToList()); 109 } 110 /// <summary> 111 /// 普通SQL查询分页方法 112 /// </summary> 113 /// <param name="index">当前页</param> 114 /// <param name="pageSize">显示行数</param> 115 /// <param name="tableName">表名/视图</param> 116 /// <param name="field">获取项</param> 117 /// <param name="filter">过滤条件</param> 118 /// <param name="orderby">排序字段+排序方向</param> 119 /// <param name="group">分组字段</param> 120 /// <returns>结果集</returns> 121 public virtual Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para) 122 { 123 //执行分页算法 124 if (index <= 0) 125 index = 1; 126 int start = (index - 1) * pageSize; 127 if (start > 0) 128 start -= 1; 129 else 130 start = 0; 131 int end = index * pageSize; 132 133 #region 查询逻辑 134 string logicSql = "SELECT"; 135 //查询项 136 if (!string.IsNullOrEmpty(field)) 137 { 138 logicSql += " " + field; 139 } 140 else 141 { 142 logicSql += " *"; 143 } 144 logicSql += " FROM (" + tableName + " ) where"; 145 //过滤条件 146 if (!string.IsNullOrEmpty(filter)) 147 { 148 logicSql += " " + filter; 149 } 150 else 151 { 152 filter = " 1=1"; 153 logicSql += " 1=1"; 154 } 155 //分组 156 if (!string.IsNullOrEmpty(group)) 157 { 158 logicSql += " group by " + group; 159 } 160 161 #endregion 162 163 //获取当前条件下数据总条数 164 int count = this.Context.Database.SqlQuery(typeof(int), "select count(*) from (" + tableName + ") where " + filter, para).Cast<int>().FirstOrDefault(); 165 string sql = "SELECT T.* FROM ( SELECT B.* FROM ( SELECT A.*,ROW_NUMBER() OVER(ORDER BY getdate()) as RN" + 166 logicSql + ") A ) B WHERE B.RN<=" + end + ") T WHERE T.RN>" + start; 167 //排序 168 if (!string.IsNullOrEmpty(orderby)) 169 { 170 sql += " order by " + orderby; 171 } 172 var list = ExecuteSqlQuery(sql, para) as IEnumerable; 173 if (list != null) 174 return new Common.PageInfo(index, pageSize, count, list.Cast<object>().ToList()); 175 return new Common.PageInfo(index, pageSize, count, new { }); 176 } 177 178 /// <summary> 179 /// 最简单的SQL分页 180 /// </summary> 181 /// <param name="index">页码</param> 182 /// <param name="pageSize">显示行数</param> 183 /// <param name="sql">纯SQL语句</param> 184 /// <param name="orderby">排序字段与方向</param> 185 /// <returns></returns> 186 public virtual Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para) 187 { 188 return this.Query(index, pageSize, sql, null, null, orderby, null, para); 189 } 190 /// <summary> 191 /// 多表联合分页算法 192 /// </summary> 193 public virtual Common.PageInfo Query(IQueryable query, int index, int PageSize) 194 { 195 var enumerable = (query as System.Collections.IEnumerable).Cast<object>(); 196 if (index < 1) 197 { 198 index = 1; 199 } 200 if (PageSize <= 0) 201 { 202 PageSize = 20; 203 } 204 205 int count = enumerable.Count(); 206 207 int maxpage = count / PageSize; 208 209 if (count % PageSize > 0) 210 { 211 maxpage++; 212 } 213 if (index > maxpage) 214 { 215 index = maxpage; 216 } 217 if (count > 0) 218 enumerable = enumerable.Skip((index - 1) * PageSize).Take(PageSize); 219 return new Common.PageInfo(index, PageSize, count, enumerable.ToList()); 220 } 221 #endregion
ADO.NET增删改查方法
1 #region ADO.NET增删改查方法 2 /// <summary> 3 /// 执行增删改方法,含事务处理 4 /// </summary> 5 public virtual object ExecuteSqlCommand(string sql, params DbParameter[] para) 6 { 7 try 8 { 9 return this.Context.Database.ExecuteSqlCommand(sql, para); 10 } 11 catch (Exception e) 12 { 13 throw e; 14 } 15 16 } 17 /// <summary> 18 /// 执行多条SQL,增删改方法,含事务处理 19 /// </summary> 20 public virtual object ExecuteSqlCommand(Dictionary<string, object> sqllist) 21 { 22 try 23 { 24 int rows = 0; 25 IEnumerator<KeyValuePair<string, object>> enumerator = sqllist.GetEnumerator(); 26 using (Transaction) 27 { 28 while (enumerator.MoveNext()) 29 { 30 rows += this.Context.Database.ExecuteSqlCommand(enumerator.Current.Key, enumerator.Current.Value); 31 } 32 Commit(); 33 } 34 return rows; 35 } 36 catch (Exception e) 37 { 38 Rollback(); 39 throw e; 40 } 41 42 } 43 /// <summary> 44 /// 执行查询方法,返回动态类,接收使用var,遍历时使用dynamic类型 45 /// </summary> 46 public virtual object ExecuteSqlQuery(string sql, params DbParameter[] para) 47 { 48 try 49 { 50 return this.Context.Database.SqlQueryForDynamic(sql, para); 51 } 52 catch (Exception e) 53 { 54 throw e; 55 } 56 } 57 #endregion
我们引用的类库和解决方案
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data; 6 using System.Data.Common; 7 using System.Data.Entity; 8 using System.Data.Entity.Infrastructure; 9 using Domain; 10 using System.Linq.Expressions; 11 using System.Collections;
完整的 RepositoryBase.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data; 6 using System.Data.Common; 7 using System.Data.Entity; 8 using System.Data.Entity.Infrastructure; 9 using Domain; 10 using System.Linq.Expressions; 11 using System.Collections; 12 13 namespace Service 14 { 15 /// <summary> 16 /// 数据操作基本实现类,公用实现方法 17 /// add yuangang by 2016-05-10 18 /// </summary> 19 /// <typeparam name="T">具体操作的实体模型</typeparam> 20 public abstract class RepositoryBase<T> : IRepository<T> where T : class 21 { 22 #region 固定公用帮助,含事务 23 24 private DbContext context = new MyConfig().db; 25 /// <summary> 26 /// 数据上下文--->根据Domain实体模型名称进行更改 27 /// </summary> 28 public DbContext Context 29 { 30 get 31 { 32 context.Configuration.ValidateOnSaveEnabled = false; 33 return context; 34 } 35 } 36 /// <summary> 37 /// 数据上下文--->拓展属性 38 /// </summary> 39 public MyConfig Config 40 { 41 get 42 { 43 return new MyConfig(); 44 } 45 } 46 /// <summary> 47 /// 公用泛型处理属性 48 /// 注:所有泛型操作的基础 49 /// </summary> 50 public DbSet<T> dbSet 51 { 52 get { return this.Context.Set<T>(); } 53 } 54 /// <summary> 55 /// 事务 56 /// </summary> 57 private DbContextTransaction _transaction = null; 58 /// <summary> 59 /// 开始事务 60 /// </summary> 61 public DbContextTransaction Transaction 62 { 63 get 64 { 65 if (this._transaction == null) 66 { 67 this._transaction = this.Context.Database.BeginTransaction(); 68 } 69 return this._transaction; 70 } 71 set { this._transaction = value; } 72 } 73 /// <summary> 74 /// 事务状态 75 /// </summary> 76 public bool Committed { get; set; } 77 /// <summary> 78 /// 异步锁定 79 /// </summary> 80 private readonly object sync = new object(); 81 /// <summary> 82 /// 提交事务 83 /// </summary> 84 public void Commit() 85 { 86 if (!Committed) 87 { 88 lock (sync) 89 { 90 if (this._transaction != null) 91 _transaction.Commit(); 92 } 93 Committed = true; 94 } 95 } 96 /// <summary> 97 /// 回滚事务 98 /// </summary> 99 public void Rollback() 100 { 101 Committed = false; 102 if (this._transaction != null) 103 this._transaction.Rollback(); 104 } 105 #endregion 106 107 #region 获取单条记录 108 /// <summary> 109 /// 通过lambda表达式获取一条记录p=>p.id==id 110 /// </summary> 111 public virtual T Get(Expression<Func<T, bool>> predicate) 112 { 113 try 114 { 115 return dbSet.AsNoTracking().SingleOrDefault(predicate); 116 } 117 catch (Exception e) 118 { 119 throw e; 120 } 121 } 122 #endregion 123 124 #region 增删改操作 125 126 /// <summary> 127 /// 添加一条模型记录,自动提交更改 128 /// </summary> 129 public virtual bool Save(T entity) 130 { 131 try 132 { 133 int row = 0; 134 var entry = this.Context.Entry<T>(entity); 135 entry.State = System.Data.Entity.EntityState.Added; 136 row = Context.SaveChanges(); 137 entry.State = System.Data.Entity.EntityState.Detached; 138 return row > 0; 139 } 140 catch (Exception e) 141 { 142 throw e; 143 } 144 145 } 146 147 /// <summary> 148 /// 更新一条模型记录,自动提交更改 149 /// </summary> 150 public virtual bool Update(T entity) 151 { 152 try 153 { 154 int rows = 0; 155 var entry = this.Context.Entry(entity); 156 entry.State = System.Data.Entity.EntityState.Modified; 157 rows = this.Context.SaveChanges(); 158 entry.State = System.Data.Entity.EntityState.Detached; 159 return rows > 0; 160 } 161 catch (Exception e) 162 { 163 throw e; 164 } 165 } 166 167 /// <summary> 168 /// 更新模型记录,如不存在进行添加操作 169 /// </summary> 170 public virtual bool SaveOrUpdate(T entity, bool isEdit) 171 { 172 try 173 { 174 return isEdit ? Update(entity) : Save(entity); 175 } 176 catch (Exception e) { throw e; } 177 } 178 179 /// <summary> 180 /// 删除一条或多条模型记录,含事务 181 /// </summary> 182 public virtual int Delete(Expression<Func<T, bool>> predicate = null) 183 { 184 try 185 { 186 int rows = 0; 187 IQueryable<T> entry = (predicate == null) ? this.dbSet.AsQueryable() : this.dbSet.Where(predicate); 188 List<T> list = entry.ToList(); 189 if (list.Count > 0) 190 { 191 for (int i = 0; i < list.Count; i++) 192 { 193 this.dbSet.Remove(list[i]); 194 } 195 rows = this.Context.SaveChanges(); 196 } 197 return rows; 198 } 199 catch (Exception e) 200 { 201 throw e; 202 } 203 } 204 /// <summary> 205 /// 使用原始SQL语句,含事务处理 206 /// </summary> 207 public virtual int DeleteBySql(string sql, params DbParameter[] para) 208 { 209 try 210 { 211 return this.Context.Database.ExecuteSqlCommand(sql, para); 212 } 213 catch (Exception e) 214 { 215 throw e; 216 } 217 } 218 #endregion 219 220 #region 多模型操作 221 222 /// <summary> 223 /// 增加多模型数据,指定独立模型集合 224 /// </summary> 225 public virtual int SaveList<T1>(List<T1> t) where T1 : class 226 { 227 try 228 { 229 if (t == null || t.Count == 0) return 0; 230 this.Context.Set<T1>().Local.Clear(); 231 foreach (var item in t) 232 { 233 this.Context.Set<T1>().Add(item); 234 } 235 return this.Context.SaveChanges(); 236 } 237 catch (Exception e) 238 { 239 throw e; 240 } 241 } 242 /// <summary> 243 /// 增加多模型数据,与当前模型一致 244 /// </summary> 245 public virtual int SaveList(List<T> t) 246 { 247 try 248 { 249 this.dbSet.Local.Clear(); 250 foreach (var item in t) 251 { 252 this.dbSet.Add(item); 253 } 254 return this.Context.SaveChanges(); 255 } 256 catch (Exception e) 257 { 258 throw e; 259 } 260 } 261 /// <summary> 262 /// 更新多模型,指定独立模型集合 263 /// </summary> 264 public virtual int UpdateList<T1>(List<T1> t) where T1 : class 265 { 266 if (t.Count <= 0) return 0; 267 try 268 { 269 foreach (var item in t) 270 { 271 this.Context.Entry<T1>(item).State = System.Data.Entity.EntityState.Modified; 272 } 273 return this.Context.SaveChanges(); 274 } 275 catch (Exception e) 276 { 277 throw e; 278 } 279 } 280 /// <summary> 281 /// 更新多模型,与当前模型一致 282 /// </summary> 283 public virtual int UpdateList(List<T> t) 284 { 285 if (t.Count <= 0) return 0; 286 try 287 { 288 foreach (var item in t) 289 { 290 this.Context.Entry(item).State = System.Data.Entity.EntityState.Modified; 291 } 292 return this.Context.SaveChanges(); 293 } 294 catch (Exception e) { throw e; } 295 } 296 /// <summary> 297 /// 批量删除数据,当前模型 298 /// </summary> 299 public virtual int DeleteList(List<T> t) 300 { 301 if (t == null || t.Count == 0) return 0; 302 foreach (var item in t) 303 { 304 this.dbSet.Remove(item); 305 } 306 return this.Context.SaveChanges(); 307 } 308 /// <summary> 309 /// 批量删除数据,自定义模型 310 /// </summary> 311 public virtual int DeleteList<T1>(List<T1> t) where T1 : class 312 { 313 try 314 { 315 if (t == null || t.Count == 0) return 0; 316 foreach (var item in t) 317 { 318 this.Context.Set<T1>().Remove(item); 319 } 320 return this.Context.SaveChanges(); 321 } 322 catch (Exception e) { throw e; } 323 } 324 #endregion 325 326 #region 存储过程操作 327 /// <summary> 328 /// 执行返回影响行数的存储过程 329 /// </summary> 330 /// <param name="procname">过程名称</param> 331 /// <param name="parameter">参数对象</param> 332 /// <returns></returns> 333 public virtual object ExecuteProc(string procname, params DbParameter[] parameter) 334 { 335 try 336 { 337 return ExecuteSqlCommand(procname, parameter); 338 } 339 catch (Exception e) 340 { 341 throw e; 342 } 343 } 344 /// <summary> 345 /// 执行返回结果集的存储过程 346 /// </summary> 347 /// <param name="procname">过程名称</param> 348 /// <param name="parameter">参数对象</param> 349 /// <returns></returns> 350 public virtual object ExecuteQueryProc(string procname, params DbParameter[] parameter) 351 { 352 try 353 { 354 return this.Context.Database.SqlFunctionForDynamic(procname, parameter); 355 } 356 catch (Exception e) 357 { 358 throw e; 359 } 360 } 361 #endregion 362 363 #region 存在验证操作 364 /// <summary> 365 /// 验证当前条件是否存在相同项 366 /// </summary> 367 public virtual bool IsExist(Expression<Func<T, bool>> predicate) 368 { 369 var entry = this.dbSet.Where(predicate); 370 return (entry.Any()); 371 } 372 373 /// <summary> 374 /// 根据SQL验证实体对象是否存在 375 /// </summary> 376 public virtual bool IsExist(string sql, params DbParameter[] para) 377 { 378 IEnumerable result = this.Context.Database.SqlQuery(typeof(int), sql, para); 379 380 if (result.GetEnumerator().Current == null || result.GetEnumerator().Current.ToString() == "0") 381 return false; 382 return true; 383 } 384 #endregion 385 386 #region 获取多条数据操作 387 /// <summary> 388 /// 返回IQueryable集合,延时加载数据 389 /// </summary> 390 public virtual IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate) 391 { 392 try 393 { 394 if (predicate != null) 395 { 396 return this.dbSet.Where(predicate).AsNoTracking<T>(); 397 } 398 return this.dbSet.AsQueryable<T>().AsNoTracking<T>(); 399 } 400 catch (Exception e) 401 { 402 throw e; 403 } 404 } 405 /// <summary> 406 /// 返回DbQuery集合,延时加载数据 407 /// </summary> 408 public virtual DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate) 409 { 410 try 411 { 412 if (predicate != null) 413 { 414 return this.dbSet.Where(predicate) as DbQuery<T>; 415 } 416 return this.dbSet; 417 } 418 catch (Exception e) 419 { 420 throw e; 421 } 422 } 423 /// <summary> 424 /// 返回List集合,不采用延时加载 425 /// </summary> 426 public virtual List<T> LoadListAll(Expression<Func<T, bool>> predicate) 427 { 428 try 429 { 430 if (predicate != null) 431 { 432 return this.dbSet.Where(predicate).AsNoTracking().ToList(); 433 } 434 return this.dbSet.AsQueryable<T>().AsNoTracking().ToList(); 435 } 436 catch (Exception e) 437 { 438 throw e; 439 } 440 } 441 /// <summary> 442 /// 返回IEnumerable集合,采用原始T-Sql方式 443 /// </summary> 444 public virtual IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para) 445 { 446 try 447 { 448 return this.Context.Database.SqlQuery<T>(sql, para); 449 } 450 catch (Exception e) 451 { 452 throw e; 453 } 454 } 455 /// <summary> 456 /// 返回IEnumerable动态集合,采用原始T-Sql方式 457 /// </summary> 458 public virtual System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para) 459 { 460 try 461 { 462 return this.Context.Database.SqlQueryForDynamic(sql, para); 463 } 464 catch (Exception e) 465 { 466 throw e; 467 } 468 } 469 /// <summary> 470 /// 返回IList集合,采用原始T-Sql方式 471 /// </summary> 472 public virtual List<T> SelectBySql(string sql, params DbParameter[] para) 473 { 474 try 475 { 476 return this.Context.Database.SqlQuery(typeof(T), sql, para).Cast<T>().ToList(); 477 } 478 catch (Exception e) 479 { 480 throw e; 481 } 482 } 483 /// <summary> 484 /// 指定泛型,返回IList集合,采用原始T-Sql方式 485 /// </summary> 486 public virtual List<T1> SelectBySql<T1>(string sql, params DbParameter[] para) 487 { 488 try 489 { 490 return this.Context.Database.SqlQuery<T1>(sql, para).ToList(); 491 } 492 catch (Exception e) 493 { 494 throw e; 495 } 496 } 497 /// <summary> 498 /// 可指定返回结果、排序、查询条件的通用查询方法,返回实体对象 499 /// </summary> 500 /// <typeparam name="TEntity">实体对象</typeparam> 501 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 502 /// <typeparam name="TResult">数据结果,与TEntity一致</typeparam> 503 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 504 /// <param name="orderby">排序字段</param> 505 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 506 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 507 /// <returns>实体集合</returns> 508 public virtual List<TResult> QueryEntity<TEntity, TOrderBy, TResult> 509 (Expression<Func<TEntity, bool>> where, 510 Expression<Func<TEntity, TOrderBy>> orderby, 511 Expression<Func<TEntity, TResult>> selector, 512 bool IsAsc) 513 where TEntity : class 514 where TResult : class 515 { 516 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 517 if (where != null) 518 { 519 query = query.Where(where); 520 } 521 522 if (orderby != null) 523 { 524 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 525 } 526 if (selector == null) 527 { 528 return query.Cast<TResult>().AsNoTracking().ToList(); 529 } 530 return query.Select(selector).AsNoTracking().ToList(); 531 } 532 533 /// <summary> 534 /// 可指定返回结果、排序、查询条件的通用查询方法,返回Object对象 535 /// </summary> 536 /// <typeparam name="TEntity">实体对象</typeparam> 537 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 538 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 539 /// <param name="orderby">排序字段</param> 540 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 541 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 542 /// <returns>自定义实体集合</returns> 543 public virtual List<object> QueryObject<TEntity, TOrderBy> 544 (Expression<Func<TEntity, bool>> where, 545 Expression<Func<TEntity, TOrderBy>> orderby, 546 Func<IQueryable<TEntity>, 547 List<object>> selector, 548 bool IsAsc) 549 where TEntity : class 550 { 551 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 552 if (where != null) 553 { 554 query = query.Where(where); 555 } 556 557 if (orderby != null) 558 { 559 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 560 } 561 if (selector == null) 562 { 563 return query.AsNoTracking().ToList<object>(); 564 } 565 return selector(query); 566 } 567 568 /// <summary> 569 /// 可指定返回结果、排序、查询条件的通用查询方法,返回动态类对象 570 /// </summary> 571 /// <typeparam name="TEntity">实体对象</typeparam> 572 /// <typeparam name="TOrderBy">排序字段类型</typeparam> 573 /// <param name="where">过滤条件,需要用到类型转换的需要提前处理与数据表一致的</param> 574 /// <param name="orderby">排序字段</param> 575 /// <param name="selector">返回结果(必须是模型中存在的字段)</param> 576 /// <param name="IsAsc">排序方向,true为正序false为倒序</param> 577 /// <returns>动态类</returns> 578 public virtual dynamic QueryDynamic<TEntity, TOrderBy> 579 (Expression<Func<TEntity, bool>> where, 580 Expression<Func<TEntity, TOrderBy>> orderby, 581 Func<IQueryable<TEntity>, 582 List<object>> selector, 583 bool IsAsc) 584 where TEntity : class 585 { 586 List<object> list = QueryObject<TEntity, TOrderBy> 587 (where, orderby, selector, IsAsc); 588 return Common.JsonConverter.JsonClass(list); 589 } 590 #endregion 591 592 #region 分页操作 593 /// <summary> 594 /// 待自定义分页函数,使用必须重写,指定数据模型 595 /// </summary> 596 public virtual IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, Common.PageCollection page) 597 { 598 return null; 599 } 600 /// <summary> 601 /// 待自定义分页函数,使用必须重写, 602 /// </summary> 603 public virtual IList<T> PageByListSql(string sql, IList<DbParameter> parameters, Common.PageCollection page) 604 { 605 return null; 606 } 607 608 /// <summary> 609 /// 对IQueryable对象进行分页逻辑处理,过滤、查询项、排序对IQueryable操作 610 /// </summary> 611 /// <param name="t">Iqueryable</param> 612 /// <param name="index">当前页</param> 613 /// <param name="PageSize">每页显示多少条</param> 614 /// <returns>当前IQueryable to List的对象</returns> 615 public virtual Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize) 616 { 617 if (index < 1) 618 { 619 index = 1; 620 } 621 if (PageSize <= 0) 622 { 623 PageSize = 20; 624 } 625 int count = query.Count(); 626 627 int maxpage = count / PageSize; 628 629 if (count % PageSize > 0) 630 { 631 maxpage++; 632 } 633 if (index > maxpage) 634 { 635 index = maxpage; 636 } 637 if (count > 0) 638 query = query.Skip((index - 1) * PageSize).Take(PageSize); 639 return new Common.PageInfo<T>(index, PageSize, count, query.ToList()); 640 } 641 /// <summary> 642 /// 通用EF分页,默认显示20条记录 643 /// </summary> 644 /// <typeparam name="TEntity">实体模型</typeparam> 645 /// <typeparam name="TOrderBy">排序类型</typeparam> 646 /// <param name="index">当前页</param> 647 /// <param name="pageSize">显示条数</param> 648 /// <param name="where">过滤条件</param> 649 /// <param name="orderby">排序字段</param> 650 /// <param name="selector">结果集合</param> 651 /// <param name="isAsc">排序方向true正序 false倒序</param> 652 /// <returns>自定义实体集合</returns> 653 public virtual Common.PageInfo<object> Query<TEntity, TOrderBy> 654 (int index, int pageSize, 655 Expression<Func<TEntity, bool>> where, 656 Expression<Func<TEntity, TOrderBy>> orderby, 657 Func<IQueryable<TEntity>, 658 List<object>> selector, 659 bool isAsc) 660 where TEntity : class 661 { 662 if (index < 1) 663 { 664 index = 1; 665 } 666 667 if (pageSize <= 0) 668 { 669 pageSize = 20; 670 } 671 672 IQueryable<TEntity> query = this.Context.Set<TEntity>(); 673 if (where != null) 674 { 675 query = query.Where(where); 676 } 677 int count = query.Count(); 678 679 int maxpage = count / pageSize; 680 681 if (count % pageSize > 0) 682 { 683 maxpage++; 684 } 685 if (index > maxpage) 686 { 687 index = maxpage; 688 } 689 690 if (orderby != null) 691 { 692 query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); 693 } 694 if (count > 0) 695 query = query.Skip((index - 1) * pageSize).Take(pageSize); 696 //返回结果为null,返回所有字段 697 if (selector == null) 698 return new Common.PageInfo<object>(index, pageSize, count, query.ToList<object>()); 699 return new Common.PageInfo<object>(index, pageSize, count, selector(query).ToList()); 700 } 701 /// <summary> 702 /// 普通SQL查询分页方法 703 /// </summary> 704 /// <param name="index">当前页</param> 705 /// <param name="pageSize">显示行数</param> 706 /// <param name="tableName">表名/视图</param> 707 /// <param name="field">获取项</param> 708 /// <param name="filter">过滤条件</param> 709 /// <param name="orderby">排序字段+排序方向</param> 710 /// <param name="group">分组字段</param> 711 /// <returns>结果集</returns> 712 public virtual Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para) 713 { 714 //执行分页算法 715 if (index <= 0) 716 index = 1; 717 int start = (index - 1) * pageSize; 718 if (start > 0) 719 start -= 1; 720 else 721 start = 0; 722 int end = index * pageSize; 723 724 #region 查询逻辑 725 string logicSql = "SELECT"; 726 //查询项 727 if (!string.IsNullOrEmpty(field)) 728 { 729 logicSql += " " + field; 730 } 731 else 732 { 733 logicSql += " *"; 734 } 735 logicSql += " FROM (" + tableName + " ) where"; 736 //过滤条件 737 if (!string.IsNullOrEmpty(filter)) 738 { 739 logicSql += " " + filter; 740 } 741 else 742 { 743 filter = " 1=1"; 744 logicSql += " 1=1"; 745 } 746 //分组 747 if (!string.IsNullOrEmpty(group)) 748 { 749 logicSql += " group by " + group; 750 } 751 752 #endregion 753 754 //获取当前条件下数据总条数 755 int count = this.Context.Database.SqlQuery(typeof(int), "select count(*) from (" + tableName + ") where " + filter, para).Cast<int>().FirstOrDefault(); 756 string sql = "SELECT T.* FROM ( SELECT B.* FROM ( SELECT A.*,ROW_NUMBER() OVER(ORDER BY getdate()) as RN" + 757 logicSql + ") A ) B WHERE B.RN<=" + end + ") T WHERE T.RN>" + start; 758 //排序 759 if (!string.IsNullOrEmpty(orderby)) 760 { 761 sql += " order by " + orderby; 762 } 763 var list = ExecuteSqlQuery(sql, para) as IEnumerable; 764 if (list != null) 765 return new Common.PageInfo(index, pageSize, count, list.Cast<object>().ToList()); 766 return new Common.PageInfo(index, pageSize, count, new { }); 767 } 768 769 /// <summary> 770 /// 最简单的SQL分页 771 /// </summary> 772 /// <param name="index">页码</param> 773 /// <param name="pageSize">显示行数</param> 774 /// <param name="sql">纯SQL语句</param> 775 /// <param name="orderby">排序字段与方向</param> 776 /// <returns></returns> 777 public virtual Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para) 778 { 779 return this.Query(index, pageSize, sql, null, null, orderby, null, para); 780 } 781 /// <summary> 782 /// 多表联合分页算法 783 /// </summary> 784 public virtual Common.PageInfo Query(IQueryable query, int index, int PageSize) 785 { 786 var enumerable = (query as System.Collections.IEnumerable).Cast<object>(); 787 if (index < 1) 788 { 789 index = 1; 790 } 791 if (PageSize <= 0) 792 { 793 PageSize = 20; 794 } 795 796 int count = enumerable.Count(); 797 798 int maxpage = count / PageSize; 799 800 if (count % PageSize > 0) 801 { 802 maxpage++; 803 } 804 if (index > maxpage) 805 { 806 index = maxpage; 807 } 808 if (count > 0) 809 enumerable = enumerable.Skip((index - 1) * PageSize).Take(PageSize); 810 return new Common.PageInfo(index, PageSize, count, enumerable.ToList()); 811 } 812 #endregion 813 814 #region ADO.NET增删改查方法 815 /// <summary> 816 /// 执行增删改方法,含事务处理 817 /// </summary> 818 public virtual object ExecuteSqlCommand(string sql, params DbParameter[] para) 819 { 820 try 821 { 822 return this.Context.Database.ExecuteSqlCommand(sql, para); 823 } 824 catch (Exception e) 825 { 826 throw e; 827 } 828 829 } 830 /// <summary> 831 /// 执行多条SQL,增删改方法,含事务处理 832 /// </summary> 833 public virtual object ExecuteSqlCommand(Dictionary<string, object> sqllist) 834 { 835 try 836 { 837 int rows = 0; 838 IEnumerator<KeyValuePair<string, object>> enumerator = sqllist.GetEnumerator(); 839 using (Transaction) 840 { 841 while (enumerator.MoveNext()) 842 { 843 rows += this.Context.Database.ExecuteSqlCommand(enumerator.Current.Key, enumerator.Current.Value); 844 } 845 Commit(); 846 } 847 return rows; 848 } 849 catch (Exception e) 850 { 851 Rollback(); 852 throw e; 853 } 854 855 } 856 /// <summary> 857 /// 执行查询方法,返回动态类,接收使用var,遍历时使用dynamic类型 858 /// </summary> 859 public virtual object ExecuteSqlQuery(string sql, params DbParameter[] para) 860 { 861 try 862 { 863 return this.Context.Database.SqlQueryForDynamic(sql, para); 864 } 865 catch (Exception e) 866 { 867 throw e; 868 } 869 } 870 #endregion 871 } 872 }
需要用的Common公共帮助类
这写类库,大家去【C#公共帮助类】找一下。有些公共帮助类,我还没来得及发布,请大家耐心等待一下哈~~~理解、理解~~
PS1:大家的实现类 是不是找不到SqlFunctionForDynamic 这个方法,这是我的失误,因为刚才有点工作的事,忘记了,现在补充上
我们在Service类库下面新建一个 查询动态类 DatabaseExtensions
代码如下:添加上这个类之后 那个方法就有了
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Configuration; 5 using System.Data; 6 using System.Data.Entity; 7 using System.Linq; 8 using System.Reflection; 9 using System.Reflection.Emit; 10 using System.Text; 11 12 namespace Service 13 { 14 /// <summary> 15 /// 查询动态类 16 /// add yuangang by 2016-05-10 17 /// </summary> 18 public static class DatabaseExtensions 19 { 20 /// <summary> 21 /// 自定义Connection对象 22 /// </summary> 23 private static IDbConnection DefaultConnection 24 { 25 get 26 { 27 return Domain.MyConfig.DefaultConnection; 28 } 29 } 30 /// <summary> 31 /// 自定义数据库连接字符串,与EF连接模式一致 32 /// </summary> 33 private static string DefaultConnectionString 34 { 35 get 36 { 37 return Domain.MyConfig.DefaultConnectionString; 38 } 39 } 40 /// <summary> 41 /// 动态查询主方法 42 /// </summary> 43 /// <returns></returns> 44 public static IEnumerable SqlQueryForDynamic(this Database db, 45 string sql, 46 params object[] parameters) 47 { 48 IDbConnection defaultConn = DefaultConnection; 49 50 //ADO.NET数据库连接字符串 51 db.Connection.ConnectionString = DefaultConnectionString; 52 53 return SqlQueryForDynamicOtherDB(db, sql, defaultConn, parameters); 54 } 55 private static IEnumerable SqlQueryForDynamicOtherDB(this Database db, string sql, IDbConnection conn, params object[] parameters) 56 { 57 conn.ConnectionString = db.Connection.ConnectionString; 58 59 if (conn.State != ConnectionState.Open) 60 { 61 conn.Open(); 62 } 63 64 IDbCommand cmd = conn.CreateCommand(); 65 cmd.CommandText = sql; 66 if (parameters != null) 67 { 68 foreach (var item in parameters) 69 { 70 cmd.Parameters.Add(item); 71 } 72 } 73 74 using (IDataReader dataReader = cmd.ExecuteReader()) 75 { 76 77 if (!dataReader.Read()) 78 { 79 return null; //无结果返回Null 80 } 81 82 #region 构建动态字段 83 84 TypeBuilder builder = DatabaseExtensions.CreateTypeBuilder( 85 "EF_DynamicModelAssembly", 86 "DynamicModule", 87 "DynamicType"); 88 89 int fieldCount = dataReader.FieldCount; 90 for (int i = 0; i < fieldCount; i++) 91 { 92 Type t = dataReader.GetFieldType(i); 93 switch (t.Name.ToLower()) 94 { 95 case "decimal": 96 t = typeof(Decimal?); 97 break; 98 case "double": 99 t = typeof(Double?); 100 break; 101 case "datetime": 102 t = typeof(DateTime?); 103 break; 104 case "single": 105 t = typeof(float?); 106 break; 107 case "int16": 108 t = typeof(int?); 109 break; 110 case "int32": 111 t = typeof(int?); 112 break; 113 case "int64": 114 t = typeof(int?); 115 break; 116 default: 117 break; 118 } 119 DatabaseExtensions.CreateAutoImplementedProperty( 120 builder, 121 dataReader.GetName(i), 122 t); 123 } 124 125 #endregion 126 127 cmd.Parameters.Clear(); 128 dataReader.Close(); 129 dataReader.Dispose(); 130 cmd.Dispose(); 131 conn.Close(); 132 conn.Dispose(); 133 134 Type returnType = builder.CreateType(); 135 136 if (parameters != null) 137 { 138 return db.SqlQuery(returnType, sql, parameters); 139 } 140 else 141 { 142 return db.SqlQuery(returnType, sql); 143 } 144 } 145 } 146 147 private static TypeBuilder CreateTypeBuilder(string assemblyName, string moduleName, string typeName) 148 { 149 TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( 150 new AssemblyName(assemblyName), 151 AssemblyBuilderAccess.Run).DefineDynamicModule(moduleName).DefineType(typeName, 152 TypeAttributes.Public); 153 typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); 154 return typeBuilder; 155 } 156 157 private static void CreateAutoImplementedProperty(TypeBuilder builder, string propertyName, Type propertyType) 158 { 159 const string PrivateFieldPrefix = "m_"; 160 const string GetterPrefix = "get_"; 161 const string SetterPrefix = "set_"; 162 163 // Generate the field. 164 FieldBuilder fieldBuilder = builder.DefineField( 165 string.Concat( 166 PrivateFieldPrefix, propertyName), 167 propertyType, 168 FieldAttributes.Private); 169 170 // Generate the property 171 PropertyBuilder propertyBuilder = builder.DefineProperty( 172 propertyName, 173 System.Reflection.PropertyAttributes.HasDefault, 174 propertyType, null); 175 176 // Property getter and setter attributes. 177 MethodAttributes propertyMethodAttributes = MethodAttributes.Public 178 | MethodAttributes.SpecialName 179 | MethodAttributes.HideBySig; 180 181 // Define the getter method. 182 MethodBuilder getterMethod = builder.DefineMethod( 183 string.Concat( 184 GetterPrefix, propertyName), 185 propertyMethodAttributes, 186 propertyType, 187 Type.EmptyTypes); 188 189 // Emit the IL code. 190 // ldarg.0 191 // ldfld,_field 192 // ret 193 ILGenerator getterILCode = getterMethod.GetILGenerator(); 194 getterILCode.Emit(OpCodes.Ldarg_0); 195 getterILCode.Emit(OpCodes.Ldfld, fieldBuilder); 196 getterILCode.Emit(OpCodes.Ret); 197 198 // Define the setter method. 199 MethodBuilder setterMethod = builder.DefineMethod( 200 string.Concat(SetterPrefix, propertyName), 201 propertyMethodAttributes, 202 null, 203 new Type[] { propertyType }); 204 205 // Emit the IL code. 206 // ldarg.0 207 // ldarg.1 208 // stfld,_field 209 // ret 210 ILGenerator setterILCode = setterMethod.GetILGenerator(); 211 setterILCode.Emit(OpCodes.Ldarg_0); 212 setterILCode.Emit(OpCodes.Ldarg_1); 213 setterILCode.Emit(OpCodes.Stfld, fieldBuilder); 214 setterILCode.Emit(OpCodes.Ret); 215 216 propertyBuilder.SetGetMethod(getterMethod); 217 propertyBuilder.SetSetMethod(setterMethod); 218 } 219 220 public static dynamic SqlFunctionForDynamic(this Database db, 221 string sql, 222 params object[] parameters) 223 { 224 IDbConnection conn = DefaultConnection; 225 226 //ADO.NET数据库连接字符串 227 conn.ConnectionString = DefaultConnectionString; 228 229 if (conn.State != ConnectionState.Open) 230 { 231 conn.Open(); 232 } 233 234 IDbCommand cmd = conn.CreateCommand(); 235 cmd.CommandText = sql; 236 cmd.CommandType = CommandType.StoredProcedure; 237 if (parameters != null) 238 { 239 foreach (var item in parameters) 240 { 241 cmd.Parameters.Add(item); 242 } 243 } 244 //1、DataReader查询数据 245 using (IDataReader dataReader = cmd.ExecuteReader()) 246 { 247 if (!dataReader.Read()) 248 { 249 return null; 250 } 251 //2、DataReader转换Json 252 string jsonstr = Common.JsonConverter.ToJson(dataReader); 253 dataReader.Close(); 254 dataReader.Dispose(); 255 cmd.Dispose(); 256 conn.Close(); 257 conn.Dispose(); 258 //3、Json转换动态类 259 dynamic dyna = Common.JsonConverter.ConvertJson(jsonstr); 260 return dyna; 261 } 262 } 263 /// <summary> 264 /// 对可空类型进行判断转换(*要不然会报错) 265 /// </summary> 266 /// <param name="value">DataReader字段的值</param> 267 /// <param name="conversionType">该字段的类型</param> 268 /// <returns></returns> 269 private static object CheckType(object value, Type conversionType) 270 { 271 if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 272 { 273 if (value == null) 274 return null; 275 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType); 276 conversionType = nullableConverter.UnderlyingType; 277 } 278 return Convert.ChangeType(value, conversionType); 279 } 280 281 /// <summary> 282 /// 判断指定对象是否是有效值 283 /// </summary> 284 /// <param name="obj"></param> 285 /// <returns></returns> 286 private static bool IsNullOrDBNull(object obj) 287 { 288 return (obj == null || (obj is DBNull)) ? true : false; 289 } 290 } 291 }
原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com