BaseRepository.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.Entity.Migrations;
  5. using System.Data.Entity.Validation;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using CommonTool;
  9. using EntityFramework.Extensions;
  10. using YZXYH.Repository.Models;
  11. using YZXYH.Repository.Interface;
  12. namespace YZXYH.Repository
  13. {
  14. public class BaseRepository<T>
  15. where T : class, new()
  16. {
  17. protected Yzxyh2017Context Context;
  18. internal DbSet<T> DbSet;
  19. protected IUnitOfWork UnitOfWork;
  20. public BaseRepository(Yzxyh2017Context context)
  21. {
  22. Context = context;
  23. DbSet = context.Set<T>();
  24. UnitOfWork = new UnitOfWork(context);
  25. }
  26. /// <summary>
  27. /// 是否存在
  28. /// </summary>
  29. /// <param name="exp">过滤条件</param>
  30. /// <returns></returns>
  31. public bool IsExist(Expression<Func<T, bool>> exp)
  32. {
  33. return Context.Set<T>().Any(exp);
  34. }
  35. /// <summary>
  36. /// 过滤排序查询
  37. /// </summary>
  38. /// <param name="exp">过滤条件(eg: u=>u.Id="1")</param>
  39. /// <param name="orderBy">排序(eg: q=>q.OrderByDescending(u=>u.Name))</param>
  40. /// <param name="includeProperties">外键</param>
  41. /// <returns> 对象集合</returns>
  42. public IQueryable<T> Get(Expression<Func<T, bool>> exp = null,
  43. Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "")
  44. {
  45. IQueryable<T> dbSet = DbSet;
  46. if (exp != null)
  47. dbSet = DbSet.Where(exp);
  48. foreach (var includeProperty in includeProperties.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
  49. {
  50. dbSet = dbSet.Include(includeProperty);
  51. }
  52. if (orderBy != null)
  53. {
  54. return orderBy(dbSet);
  55. }
  56. return dbSet;
  57. }
  58. /// <summary>
  59. /// 分页排序记录
  60. /// </summary>
  61. /// <param name="pageindex">The pageindex.</param>
  62. /// <param name="pagesize">The pagesize.</param>
  63. /// <param name="orderBy">排序(eg: q=>q.OrderByDescending(u=>u.Name))</param>
  64. /// <param name="exp">过滤条件(eg: u=>u.Id="1")</param>
  65. /// <param name="includeProperties">外键</param>
  66. public IQueryable<T> Get(int pageindex, int pagesize, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, Expression<Func<T, bool>> exp = null, string includeProperties = "")
  67. {
  68. if (pageindex < 1) pageindex = 1;
  69. return Get(exp, orderBy, includeProperties).Skip(pagesize * (pageindex - 1)).Take(pagesize);
  70. }
  71. /// <summary>
  72. /// 查找单个
  73. /// </summary>
  74. public T GetSingle(Expression<Func<T, bool>> exp)
  75. {
  76. return DbSet.AsNoTracking().FirstOrDefault(exp);
  77. }
  78. /// <summary>
  79. /// 根据Id获取数据
  80. /// </summary>
  81. /// <param name="id"></param>
  82. /// <returns></returns>
  83. public T GetById(string id)
  84. {
  85. return DbSet.Find(id);
  86. }
  87. /// <summary>
  88. /// 根据过滤条件获取记录数
  89. /// </summary>
  90. public int GetCount(Expression<Func<T, bool>> exp = null)
  91. {
  92. return Get(exp).Count();
  93. }
  94. /// <summary>
  95. /// 普通插入
  96. /// </summary>
  97. /// <param name="t"></param>
  98. public void Insert(T t)
  99. {
  100. DbSet.Add(t);
  101. }
  102. /// <summary>
  103. /// 没有主键Id的插入
  104. /// </summary>
  105. /// <param name="t"></param>
  106. public void InsertNoId(T t)
  107. {
  108. var propertyInfo = t.GetType().GetProperty("Id");
  109. if (propertyInfo != null) propertyInfo.SetValue(t, Guid.NewGuid().ToString("N"));
  110. DbSet.Add(t);
  111. }
  112. /// <summary>
  113. /// 批量插入
  114. /// </summary>
  115. /// <param name="ts">The entities.</param>
  116. public void BatchInsert(T[] ts)
  117. {
  118. foreach (var t in ts)
  119. {
  120. var propertyInfo = t.GetType().GetProperty("Id");
  121. if (propertyInfo != null) propertyInfo.SetValue(t, Guid.NewGuid().ToString("N"));
  122. }
  123. DbSet.AddRange(ts);
  124. }
  125. /// <summary>
  126. /// 删除记录
  127. /// </summary>
  128. /// <param name="t"></param>
  129. public void Delete(T t)
  130. {
  131. DbSet.Attach(t);
  132. DbSet.Remove(t);
  133. }
  134. /// <summary>
  135. /// 删除记录
  136. /// </summary>
  137. /// <param name="exp">过滤条件</param>
  138. public virtual void Delete(Expression<Func<T, bool>> exp)
  139. {
  140. DbSet.Where(exp).Delete();
  141. }
  142. /// <summary>
  143. ///根据Id删除
  144. /// </summary>
  145. /// <param name="id"></param>
  146. public void DeleteById(string id)
  147. {
  148. Delete(GetById(id));
  149. }
  150. /// <summary>
  151. /// 更新
  152. /// </summary>
  153. /// <param name="t"></param>
  154. public void Update(T t)
  155. {
  156. DbSet.Attach(t);
  157. Context.Entry(t).State = EntityState.Modified;
  158. }
  159. /// <summary>
  160. /// 实现按需要只更新部分更新
  161. /// <para>如:Update(u =>u.Id==1,u =>new User{Name="ok"});</para>
  162. /// </summary>
  163. /// <param name="where">The where.</param>
  164. /// <param name="t">The entity.</param>
  165. public void Update(Expression<Func<T, bool>> where, Expression<Func<T, T>> t)
  166. {
  167. Context.Set<T>().Where(where).Update(t);
  168. }
  169. /// <summary>
  170. /// 按指定id更新实体,会更新整个实体
  171. /// </summary>
  172. /// <param name="identityExp">The identity exp.</param>
  173. /// <param name="t">The entity.</param>
  174. public void Update(Expression<Func<T, object>> identityExp, T t)
  175. {
  176. DbSet.AddOrUpdate(identityExp, t);
  177. }
  178. /// <summary>
  179. /// 查询记录条数
  180. /// </summary>
  181. /// <param name="queryStrs">参数 “表名 | 条件语句 , 表名 | 条件语句”</param>
  182. /// (多个查询以 , 分隔,表名与条件语句以 | 分隔)
  183. /// <returns></returns>
  184. public string[] GetCounts(string[] queryStrs)
  185. {
  186. List<string> counts = new List<string> { "true" };
  187. foreach (var queryStr in queryStrs)
  188. {
  189. string[] strs = queryStr.Split('|');
  190. if (strs.Length != 2)
  191. {
  192. counts.Clear();
  193. counts.Add("参数有误,请检查!" + strs[0]);
  194. return counts.ToArray();
  195. }
  196. var tableName = strs[0];
  197. var whereStr = strs[1];
  198. try
  199. {
  200. var sqlStr = $"SELECT Count(*) FROM {tableName} WHERE {whereStr} ";
  201. var count = Context.Database.SqlQuery<int>(sqlStr).First().ToString();
  202. //var count = db.Database.SqlQuery<int>("SELECT Count(*) FROM @p0 WHERE @p1", new SqlParameter("@p0", tableName), new SqlParameter("@p1", whereStr)).First().ToString();
  203. counts.Add(count);
  204. }
  205. catch
  206. {
  207. counts.Clear();
  208. counts.Add("参数有误!请检查! " + tableName + " || " + whereStr);
  209. return counts.ToArray();
  210. }
  211. }
  212. return counts.ToArray();
  213. }
  214. public bool Save()
  215. {
  216. try
  217. {
  218. Context.SaveChanges();
  219. return true;
  220. }
  221. catch(DbEntityValidationException e)
  222. {
  223. LogHelper.Error(e.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage);
  224. return false;
  225. }
  226. }
  227. }
  228. }