using DW5S.DTO; using DW5S.Entity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Query; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DW5S.Repostory { public interface IRepository where T : BaseEntity { IQueryable AsQueryable(); Task GetByIdAsync(object id); Task> GetAllAsync(); Task> GetAllAsync(Expression> keySelector = null, bool asc = true); Task> FindAsync(Expression> predicate); Task> FindAsync(Expression> predicate, Expression> keySelector = null, bool asc = true); Task> GetDistinctAsync(Expression> selector); Task FirstOrDefaultAsync(Expression> predicate = null); Task AddOrUpdateAsync(T entity); Task AddOrUpdateAsync(IEnumerable entitis); /// /// 修改某些字段 /// expression s => s.SetProperty(b => b.Enable, true) /// /// /// ddd /// Task UpdatePropAsync(Expression> predicate, Expression, SetPropertyCalls>> expression); Task DeleteAsync(T entity); Task DeleteAsync(IEnumerable entitis); Task DeleteAsync(Expression> predicate = null); Task AnyAsync(Expression> predicate = null); T MaxBy(Expression> selector, Expression> predicate = null); Task> GetPageData(PageQueryDto dto, IQueryable queryable); } public class Repository : IRepository where T : BaseEntity { protected readonly OracleContext ctx; protected readonly DbSet dbSet; public Repository(OracleContext ctx) { this.ctx = ctx; this.dbSet = ctx.Set(); } public IQueryable AsQueryable() { return dbSet.AsQueryable(); } public async Task GetByIdAsync(object id) { return await dbSet.FindAsync(id); } public async Task> GetAllAsync() { return await dbSet.ToListAsync(); } public async Task> GetPageData(PageQueryDto dto, IQueryable queryable) { if (dto.Page < 1) dto.Page = 1; var count = await queryable.LongCountAsync(); if (count == 0) { return new PageData() { CountPerPage = dto.CountPerPage, Data = new List(), Page = 1, TotalCount = 0, }; } PageData pageData = new PageData() { CountPerPage = dto.CountPerPage, TotalCount = count, }; if (pageData.TotalPage < dto.Page) { dto.Page = pageData.TotalPage;//没有这么多页就查询最后一页数据 } int skip = dto.CountPerPage * (dto.Page - 1); queryable = queryable.Skip(skip).Take(dto.CountPerPage); var data = await queryable.ToListAsync(); pageData.Page = dto.Page; pageData.Data = data; return pageData; } public async Task> GetAllAsync(Expression> keySelector = null, bool asc = true) { if (keySelector == null) { return await dbSet.ToListAsync(); } else { if (asc) return await dbSet.OrderBy(keySelector).ToListAsync(); else return await dbSet.OrderByDescending(keySelector).ToListAsync(); } } public async Task> FindAsync(Expression> predicate) { return await dbSet.Where(predicate).ToListAsync(); } public async Task> FindAsync(Expression> predicate, Expression> keySelector = null, bool asc = true) { if (keySelector == null) { return await dbSet.Where(predicate).ToListAsync(); } else { if (asc) return await dbSet.Where(predicate).OrderBy(keySelector).ToListAsync(); else return await dbSet.Where(predicate).OrderByDescending(keySelector).ToListAsync(); } } public async Task FirstOrDefaultAsync(Expression> predicate = null) { if (predicate != null) return await dbSet.Where(predicate).FirstOrDefaultAsync(); return await dbSet.FirstOrDefaultAsync(); } public async Task> GetDistinctAsync(Expression> selector) { var res = await dbSet.Select(selector).Distinct().ToListAsync(); return res; } public async Task AddOrUpdateAsync(IEnumerable entity) { if (entity.First().Id.Equals(0)) { foreach (var item in entity) { item.CreateTime = DateTime.Now; item.UpdateTime = DateTime.Now; } await dbSet.AddRangeAsync(entity); } else { foreach (var item in entity) { item.UpdateTime = DateTime.Now; } dbSet.UpdateRange(entity); } } public async Task AddOrUpdateAsync(T entity) { if (entity.Id.Equals(0)) { entity.CreateTime = DateTime.Now; entity.UpdateTime = DateTime.Now; var res = await dbSet.AddAsync(entity); return res.Entity; } else { entity.UpdateTime = DateTime.Now; var res = dbSet.Update(entity); return res.Entity; } } public async Task DeleteAsync(T entity) { return await dbSet.Where(p => p.Id.Equals(entity.Id)).ExecuteDeleteAsync(); } public async Task DeleteAsync(IEnumerable entities) { var ids = entities.Select(p => p.Id); return await DeleteAsync(p => ids.Contains(p.Id)); } public async Task DeleteAsync(Expression> predicate = null) { return await dbSet.Where(predicate).ExecuteDeleteAsync(); } public async Task AnyAsync(Expression> predicate = null) { return await dbSet.AnyAsync(predicate); } public T MaxBy(Expression> selector, Expression> predicate = null) { if (predicate == null) return dbSet.MaxBy(selector); else return dbSet.Where(predicate).MaxBy(selector); } public async Task UpdatePropAsync(Expression> predicate, Expression, SetPropertyCalls>> expression) { return await dbSet.Where(predicate) .ExecuteUpdateAsync(expression); } } }