using DW5S.Entity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; 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); /// /// 修改某些字段 /// /// /// /// /// /// Task UpdatePropAsync(Expression> predicate, Func propertyExpression, TProperty value); 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); } 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> 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 == 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 == 0) { var res = await dbSet.AddAsync(entity); return res.Entity; } else { var res = dbSet.Update(entity); return res.Entity; } } public async Task DeleteAsync(T entity) { return await dbSet.Where(p => p.Id == 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, Func propertyExpression, TProperty value) { return await dbSet.Where(predicate) .ExecuteUpdateAsync(setters => setters.SetProperty(propertyExpression, value)); } } }