首页 > 代码库 > C#数据仓储类

C#数据仓储类

https://ninesky.codeplex.com/SourceControl/latest

  1 /*==============================  2 版本:v0.1  3 创建:2016.2.6  4 作者:洞庭夕照  5 博客:http://mzwhj.cnblogs.com  6 -----------------------------  7 修改:2016.3.4  8 public int Delete(T entity, bool isSave)  9 Remove 改为Attach 10 ----------------------------- 11 修改:2016.3.17 12 public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where, OrderParam[] orderParams) 13 排序参数Expression<Func<T, TKey>> order, bool asc 改为  OrderParam[] orderParams 14 ==============================*/ 15  16 using System; 17 using System.Collections.Generic; 18 using System.Data.Entity; 19 using System.Linq; 20 using System.Linq.Expressions; 21 using Ninesky.Auxiliary; 22  23 namespace Ninesky.DataLibrary 24 { 25     /// <summary> 26     /// 数据仓储类 27     /// </summary> 28     /// <typeparam name="T">实体模型</typeparam> 29     public class Repository<T> where T : class 30     { 31         /// <summary> 32         /// 数据上下文 33         /// </summary> 34         public DbContext DbContext { get; set; } 35  36         public Repository() 37         { } 38  39         /// <summary> 40         /// 构造函数 41         /// </summary> 42         /// <param name="dbContext">数据上下文</param> 43         public Repository(DbContext dbContext) 44         { 45             DbContext = dbContext; 46         } 47  48         //查找实体 49         #region Find 50         /// <summary> 51         /// 查找实体 52         /// </summary> 53         /// <param name="ID">实体主键值</param> 54         /// <returns></returns> 55         public T Find(int ID) 56         { 57             return DbContext.Set<T>().Find(ID); 58         } 59  60         /// <summary> 61         /// 查找实体 62         /// </summary> 63         /// <param name="where">查询Lambda表达式</param> 64         /// <returns></returns> 65         public T Find(Expression<Func<T, bool>> where) 66         { 67             return DbContext.Set<T>().SingleOrDefault(where); 68         } 69         #endregion 70  71         //查找实体列表 72         #region FindList 73         /// <summary> 74         /// 查找实体列表 75         /// </summary> 76         /// <returns></returns> 77         public IQueryable<T> FindList() 78         { 79             return DbContext.Set<T>(); 80         } 81  82         /// <summary> 83         /// 查找实体列表 84         /// </summary> 85         /// <param name="where">查询Lambda表达式</param> 86         /// <returns></returns> 87         public IQueryable<T> FindList(Expression<Func<T, bool>> where) 88         { 89             return DbContext.Set<T>().Where(where); 90         } 91  92         /// <summary> 93         /// 查找实体列表 94         /// </summary> 95         /// <param name="where">查询Lambda表达式</param> 96         /// <param name="number">获取的记录数量</param> 97         /// <returns></returns> 98         public IQueryable<T> FindList(Expression<Func<T, bool>> where, int number) 99         {100             return DbContext.Set<T>().Where(where).Take(number);101         }102 103         /// <summary>104         /// 查找实体列表105         /// </summary>106         /// <param name="where">查询Lambda表达式</param>107         /// <param name="orderParam">排序参数</param>108         /// <returns></returns>109         public IQueryable<T> FindList(Expression<Func<T, bool>> where, OrderParam orderParam)110         {111             return FindList(where, orderParam, 0);112         }113 114         /// <summary>115         /// 查找实体列表116         /// </summary>117         /// <param name="where">查询Lambda表达式</param>118         /// <param name="orderParam">排序参数</param>119         /// <param name="number">获取的记录数量【0-不启用】</param>120         public IQueryable<T> FindList(Expression<Func<T, bool>> where, OrderParam orderParam, int number)121         {122             OrderParam[] _orderParams = null;123             if (orderParam != null) _orderParams = new OrderParam[] { orderParam };124             return FindList(where, _orderParams, number);125         }126 127         /// <summary>128         /// 查找实体列表129         /// </summary>130         /// <param name="where">查询Lambda表达式</param>131         /// <param name="orderParams">排序参数</param>132         /// <param name="number">获取的记录数量【0-不启用】</param>133         /// <returns></returns>134         public IQueryable<T> FindList(Expression<Func<T, bool>> where, OrderParam[] orderParams, int number)135         {136             var _list = DbContext.Set<T>().Where(where);137             var _orderParames = Expression.Parameter(typeof(T), "o");138             if (orderParams != null && orderParams.Length > 0)139             {140                 bool _isFirstParam = true;141                 for (int i = 0; i < orderParams.Length; i++)142                 {143                     //根据属性名获取属性144                     var _property = typeof(T).GetProperty(orderParams[i].PropertyName);145                     //创建一个访问属性的表达式146                     var _propertyAccess = Expression.MakeMemberAccess(_orderParames, _property);147                     var _orderByExp = Expression.Lambda(_propertyAccess, _orderParames);148                     string _orderName;149                     if (_isFirstParam)150                     {151                         _orderName = orderParams[i].Method == OrderMethod.ASC ? "OrderBy" : "OrderByDescending";152                         _isFirstParam = false;153                     }154                     else _orderName = orderParams[i].Method == OrderMethod.ASC ? "ThenBy" : "ThenByDescending";155                     MethodCallExpression resultExp = Expression.Call(typeof(Queryable), _orderName, new Type[] { typeof(T), _property.PropertyType }, _list.Expression, Expression.Quote(_orderByExp));156                     _list = _list.Provider.CreateQuery<T>(resultExp);157                 }158             }159             if (number > 0) _list = _list.Take(number);160             return _list;161         }162         #endregion163 164         //查找实体分页列表165         #region FindPageList166 167         /// <summary>168         /// 查找分页列表169         /// </summary>170         /// <param name="pageSize">每页记录数。必须大于1</param>171         /// <param name="pageIndex">页码。首页从1开始,页码必须大于1</param>172         /// <param name="totalNumber">总记录数</param>173         /// <returns></returns>174         public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber)175         {176             OrderParam _orderParam = null;177             return FindPageList(pageSize, pageIndex, out totalNumber, _orderParam);178         }179 180         /// <summary>181         /// 查找分页列表182         /// </summary>183         /// <param name="pageSize">每页记录数。必须大于1</param>184         /// <param name="pageIndex">页码。首页从1开始,页码必须大于1</param>185         /// <param name="totalNumber">总记录数</param>186         /// <param name="order">排序键</param>187         /// <param name="asc">是否正序</param>188         /// <returns></returns>189         public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, OrderParam orderParam)190         {191             return FindPageList(pageSize, pageIndex, out totalNumber, (T) => true, orderParam);192         }193 194         /// <summary>195         /// 查找分页列表196         /// </summary>197         /// <param name="pageSize">每页记录数。必须大于1</param>198         /// <param name="pageIndex">页码。首页从1开始,页码必须大于1</param>199         /// <param name="totalNumber">总记录数</param>200         /// <param name="where">查询表达式</param>201         public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where)202         {203             OrderParam _param = null;204             return FindPageList(pageSize, pageIndex, out totalNumber, where, _param);205         }206 207         /// <summary>208         /// 查找分页列表209         /// </summary>210         /// <param name="pageSize">每页记录数。</param>211         /// <param name="pageIndex">页码。首页从1开始</param>212         /// <param name="totalNumber">总记录数</param>213         /// <param name="where">查询表达式</param>214         /// <param name="orderParam">排序【null-不设置】</param>215         /// <returns></returns>216         public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where, OrderParam orderParam)217         {218             OrderParam[] _orderParams = null;219             if (orderParam != null) _orderParams = new OrderParam[] { orderParam };220             return FindPageList(pageSize, pageIndex, out totalNumber, where, _orderParams);221         }222 223         /// <summary>224         /// 查找分页列表225         /// </summary>226         /// <param name="pageSize">每页记录数。</param>227         /// <param name="pageIndex">页码。首页从1开始</param>228         /// <param name="totalNumber">总记录数</param>229         /// <param name="where">查询表达式</param>230         /// <param name="orderParams">排序【null-不设置】</param>231         public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where, OrderParam[] orderParams)232         {233             if (pageIndex < 1) pageIndex = 1;234             if (pageSize < 1) pageSize = 10;235             IQueryable<T> _list = DbContext.Set<T>().Where(where);236             var _orderParames = Expression.Parameter(typeof(T), "o");237             if (orderParams != null && orderParams.Length > 0)238             {239                 for (int i = 0; i < orderParams.Length; i++)240                 {241                     //根据属性名获取属性242                     var _property = typeof(T).GetProperty(orderParams[i].PropertyName);243                     //创建一个访问属性的表达式244                     var _propertyAccess = Expression.MakeMemberAccess(_orderParames, _property);245                     var _orderByExp = Expression.Lambda(_propertyAccess, _orderParames);246                     string _orderName = orderParams[i].Method == OrderMethod.ASC ? "OrderBy" : "OrderByDescending";247                     MethodCallExpression resultExp = Expression.Call(typeof(Queryable), _orderName, new Type[] { typeof(T), _property.PropertyType }, _list.Expression, Expression.Quote(_orderByExp));248                     _list = _list.Provider.CreateQuery<T>(resultExp);249                 }250             }251             totalNumber = _list.Count();252             return _list.Skip((pageIndex - 1) * pageSize).Take(pageSize);253         }254 255         #endregion256 257         //添加实体258         #region Add259 260         /// <summary>261         /// 添加实体【立即保存】262         /// </summary>263         /// <param name="entity">实体</param>264         /// <returns>受影响的对象的数目</returns>265         public int Add(T entity)266         {267             return Add(entity, true);268         }269 270         /// <summary>271         /// 添加实体272         /// </summary>273         /// <param name="entity">实体</param>274         /// <param name="isSave">是否立即保存</param>275         /// <returns>在“isSave”为True时返回受影响的对象的数目,为False时直接返回0</returns>276         public int Add(T entity, bool isSave)277         {278             DbContext.Set<T>().Add(entity);279             return isSave ? DbContext.SaveChanges() : 0;280         }281 282         #endregion283 284         //更新实体285         #region Update286 287         /// <summary>288         /// 更新实体【立即保存】289         /// </summary>290         /// <param name="entity">实体</param>291         /// <returns>受影响的对象的数目</returns>292         public int Update(T entity)293         {294             return Update(entity, true);295         }296 297         /// <summary>298         /// 更新实体299         /// </summary>300         /// <param name="entity">实体</param>301         /// <param name="isSave">是否立即保存</param>302         /// <returns>在“isSave”为True时返回受影响的对象的数目,为False时直接返回0</returns>303         public int Update(T entity, bool isSave)304         {305             DbContext.Set<T>().Attach(entity);306             DbContext.Entry<T>(entity).State = EntityState.Modified;307             return isSave ? DbContext.SaveChanges() : 0;308         }309         #endregion310 311         //删除312         #region Delete313 314         /// <summary>315         /// 删除实体【立即保存】316         /// </summary>317         /// <param name="entity">实体</param>318         /// <returns>受影响的对象的数目</returns>319         public int Delete(T entity)320         {321             return Delete(entity, true);322         }323 324         /// <summary>325         /// 删除实体326         /// </summary>327         /// <param name="entity">实体</param>328         /// <param name="isSave">是否立即保存</param>329         /// <returns>在“isSave”为True时返回受影响的对象的数目,为False时直接返回0</returns>330         public int Delete(T entity, bool isSave)331         {332             DbContext.Set<T>().Attach(entity);333             DbContext.Entry<T>(entity).State = EntityState.Deleted;334             return isSave ? DbContext.SaveChanges() : 0;335         }336 337         /// <summary>338         /// 批量删除实体339         /// </summary>340         /// <param name="entities">实体集合</param>341         /// <returns>受影响的对象的数目</returns>342         public int Delete(IEnumerable<T> entities)343         {344             DbContext.Set<T>().RemoveRange(entities);345             return DbContext.SaveChanges();346         }347         #endregion348 349         //记录数350         #region Count351 352         /// <summary>353         /// 记录数354         /// </summary>355         /// <returns></returns>356         public int Count()357         {358             return DbContext.Set<T>().Count();359         }360 361         /// <summary>362         /// 记录数363         /// </summary>364         /// <param name="predicate">表达式</param>365         /// <returns></returns>366         public int Count(Expression<Func<T, bool>> predicate)367         {368             return DbContext.Set<T>().Count(predicate);369         }370         #endregion371 372         /// <summary>373         /// 记录是否存在374         /// </summary>375         /// <param name="predicate">表达式</param>376         /// <returns></returns>377         public bool IsContains(Expression<Func<T, bool>> predicate)378         {379             return Count(predicate) > 0;380         }381 382         /// <summary>383         /// 保存数据【在Add、Upate、Delete未立即保存的情况下使用】384         /// </summary>385         /// <returns>受影响的记录数</returns>386         public int Save()387         {388             return DbContext.SaveChanges();389         }390     }391 }

 

C#数据仓储类