RepositoryBase.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using Microsoft.EntityFrameworkCore;
  2. using Ropin.Inspection.Model;
  3. using Ropin.Inspection.Model.Entities;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace Ropin.Inspection.Repository
  11. {
  12. // 仓储
  13. public class RepositoryBase<T, TId> : IRepositoryBase<T>, IRepositoryBaseById<T, TId> where T : class
  14. {
  15. private readonly DbSet<T> _dbSet;
  16. public InspectionDbContext DbContext { get; set; }
  17. public RepositoryBase(InspectionDbContext dbContext)
  18. {
  19. DbContext = dbContext;
  20. _dbSet = DbContext.Set<T>();
  21. }
  22. public void Create(T entity)
  23. {
  24. DbContext.Set<T>().Add(entity);
  25. }
  26. public async Task CreateOneAsync(T entity)
  27. {
  28. await DbContext.Set<T>().AddAsync(entity);
  29. }
  30. public void Delete(T entity)
  31. {
  32. DbContext.Set<T>().Remove(entity);
  33. }
  34. public async Task<int> RemoveAsync(T entity)
  35. {
  36. this._dbSet.Remove(entity);
  37. return await this.DbContext.SaveChangesAsync();
  38. }
  39. public async Task<int> RemoveRangeAsync(IEnumerable<T> entities)
  40. {
  41. this._dbSet.RemoveRange(entities);
  42. return await this.DbContext.SaveChangesAsync();
  43. }
  44. public IEnumerable<T> GetAll()
  45. {
  46. return DbContext.Set<T>().AsEnumerable();
  47. }
  48. public Task<IEnumerable<T>> GetAllAsync()
  49. {
  50. //??
  51. return Task.FromResult(DbContext.Set<T>().AsEnumerable());
  52. }
  53. public Task<IEnumerable<T>> GetByConditionAsync(Expression<Func<T, bool>> expression)
  54. {
  55. return Task.FromResult(DbContext.Set<T>().Where(expression).AsEnumerable());
  56. }
  57. public async Task<T> GetByIdAsync(TId id)
  58. {
  59. return await DbContext.Set<T>().FindAsync(id);
  60. }
  61. public async Task<bool> DeleteAsync(TId id)
  62. {
  63. var v = await GetByIdAsync(id);
  64. DbContext.Set<T>().Remove(v);
  65. return await SaveAsync();
  66. }
  67. public async Task<bool> IsExistAsync(TId id)
  68. {
  69. return await DbContext.Set<T>().FindAsync(id) != null;
  70. }
  71. public async Task<bool> SaveAsync()
  72. {
  73. return await DbContext.SaveChangesAsync() > 0;
  74. }
  75. public void Update(T entity)
  76. {
  77. DbContext.Set<T>().Update(entity);
  78. }
  79. //public async Task<bool> UpdateOneAsync(T entity)
  80. //{
  81. // Update(entity);
  82. // return await SaveAsync();
  83. //}
  84. //public async Task<bool> DeleteOneAsync(T entity)
  85. //{
  86. // Update(entity);
  87. // return await SaveAsync();
  88. //}
  89. public virtual async Task<int> CreateRangeAsync(IEnumerable<T> entities)
  90. {
  91. await DbContext.Set<T>().AddRangeAsync(entities);
  92. return await DbContext.SaveChangesAsync();
  93. }
  94. /// <summary>
  95. /// 分页查询异步
  96. /// </summary>
  97. /// <param name="whereLambda">查询添加(可有,可无)</param>
  98. /// <param name="ordering">排序条件(一定要有,多个用逗号隔开,倒序开头用-号)</param>
  99. /// <param name="pageIndex">当前页码</param>
  100. /// <param name="pageSize">每页大小</param>
  101. /// <returns></returns>
  102. public async Task<PageData<T>> GetPageAsync(Expression<Func<T, bool>> whereLambda, string ordering,bool IsPagination, int pageIndex, int pageSize, bool isNoTracking = true)
  103. {
  104. // 分页 一定注意: Skip 之前一定要 OrderBy
  105. if (string.IsNullOrEmpty(ordering))
  106. {
  107. ordering = nameof(T) + "D_CreateOn";//默认以创建时间排序
  108. }
  109. var data = _dbSet.OrderByBatch(ordering);
  110. if (whereLambda != null)
  111. {
  112. data = isNoTracking ? data.Where(whereLambda).AsNoTracking() : data.Where(whereLambda);
  113. }
  114. //查看生成的sql,找到大数据下分页巨慢原因为order by 耗时
  115. //var sql = data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToSql();
  116. //File.WriteAllText(@"D:\sql.txt",sql);
  117. PageData<T> pageData = new PageData<T>
  118. {
  119. Totals = await data.CountAsync(),
  120. Rows = IsPagination?await data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(): await data.ToListAsync()
  121. };
  122. return pageData;
  123. }
  124. }
  125. }