using Microsoft.EntityFrameworkCore; using Ropin.Inspection.Model; using Ropin.Inspection.Model.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Ropin.Inspection.Repository { // 仓储 public class RepositoryBase : IRepositoryBase, IRepositoryBaseById where T : class { private readonly DbSet _dbSet; public InspectionDbContext DbContext { get; set; } public RepositoryBase(InspectionDbContext dbContext) { DbContext = dbContext; _dbSet = DbContext.Set(); } public void Create(T entity) { DbContext.Set().Add(entity); } public async Task CreateOneAsync(T entity) { await DbContext.Set().AddAsync(entity); } public void Delete(T entity) { DbContext.Set().Remove(entity); } public async Task RemoveAsync(T entity) { this._dbSet.Remove(entity); return await this.DbContext.SaveChangesAsync(); } public async Task RemoveRangeAsync(IEnumerable entities) { this._dbSet.RemoveRange(entities); return await this.DbContext.SaveChangesAsync(); } public IEnumerable GetAll() { return DbContext.Set().AsEnumerable(); } public Task> GetAllAsync() { //?? return Task.FromResult(DbContext.Set().AsEnumerable()); } public Task> GetByConditionAsync(Expression> expression) { return Task.FromResult(DbContext.Set().Where(expression).AsEnumerable()); } public async Task GetByIdAsync(TId id) { return await DbContext.Set().FindAsync(id); } public async Task DeleteAsync(TId id) { var v = await GetByIdAsync(id); DbContext.Set().Remove(v); return await SaveAsync(); } public async Task IsExistAsync(TId id) { return await DbContext.Set().FindAsync(id) != null; } public async Task SaveAsync() { return await DbContext.SaveChangesAsync() > 0; } public void Update(T entity) { DbContext.Set().Update(entity); } //public async Task UpdateOneAsync(T entity) //{ // Update(entity); // return await SaveAsync(); //} //public async Task DeleteOneAsync(T entity) //{ // Update(entity); // return await SaveAsync(); //} public virtual async Task CreateRangeAsync(IEnumerable entities) { await DbContext.Set().AddRangeAsync(entities); return await DbContext.SaveChangesAsync(); } /// /// 分页查询异步 /// /// 查询添加(可有,可无) /// 排序条件(一定要有,多个用逗号隔开,倒序开头用-号) /// 当前页码 /// 每页大小 /// public async Task> GetPageAsync(Expression> whereLambda, string ordering,bool IsPagination, int pageIndex, int pageSize, bool isNoTracking = true) { // 分页 一定注意: Skip 之前一定要 OrderBy if (string.IsNullOrEmpty(ordering)) { ordering = nameof(T) + "D_CreateOn";//默认以创建时间排序 } var data = _dbSet.OrderByBatch(ordering); if (whereLambda != null) { data = isNoTracking ? data.Where(whereLambda).AsNoTracking() : data.Where(whereLambda); } //查看生成的sql,找到大数据下分页巨慢原因为order by 耗时 //var sql = data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToSql(); //File.WriteAllText(@"D:\sql.txt",sql); PageData pageData = new PageData { Totals = await data.CountAsync(), Rows = IsPagination?await data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(): await data.ToListAsync() }; return pageData; } } }