using Permission.Infrastructure.Core; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using System.Reflection; using Permission.Infrastructure.WebControls; using Permission.Entity.DbContext; using Permission.Infrastructure.Repositories; namespace Permission.Data.Repositories { /// /// 仓储数据访问基接口实现 /// /// public class BaseRepository : IBaseRepository where T : BaseEntity { #region 数据上下文 /// /// 数据上下文 /// private readonly PermissionContext _context; /// /// 工作单元 /// private IUnitOfWork _unitOfWork; public IQueryable Entities => _context.Set(); public BaseRepository(PermissionContext context, IUnitOfWork unitOfWork) { _context = context; _unitOfWork = unitOfWork; } #endregion #region 单模型 CRUD 操作 public virtual bool Save(T entity, bool isCommit = true) { _context.Add(entity); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task SaveAsync(T entity, bool isCommit = true) { _context.Set().Add(entity); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool Update(T entity, bool isCommit = true) { if (_context.Entry(entity).State == EntityState.Detached) { _context.Set().Attach(entity); _context.Entry(entity).State = EntityState.Modified; } else { _context.Entry(entity).State = EntityState.Modified; } if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task UpdateAsync(T entity, bool isCommit = true) { //_context.Set().Attach(entity); //_context.Entry(entity).State = EntityState.Modified; if (_context.Entry(entity).State == EntityState.Detached) { _context.Set().Attach(entity); _context.Entry(entity).State = EntityState.Modified; } else { _context.Entry(entity).State = EntityState.Modified; } if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool SaveOrUpdate(T entity, bool isSave, bool isCommit = true) { return isSave ? Save(entity, isCommit) : Update(entity, isCommit); } public virtual async Task SaveOrUpdateAsync(T entity, bool isSave, bool isCommit = true) { return isSave ? await SaveAsync(entity, isCommit) : await UpdateAsync(entity, isCommit); } public virtual T Get(Expression> predicate) { //return _context.Set().AsNoTracking().SingleOrDefault(predicate); return _context.Set().SingleOrDefault(predicate); } public virtual T Get(object key) { return _context.Set().Find(key); } public virtual async Task GetAsync(object key) { return await Task.Run(() => _context.Set().Find(key)); } public virtual async Task GetAsync(Expression> predicate) { return await Task.Run(() => _context.Set().SingleOrDefault(predicate)); } public virtual bool Delete(T entity, bool isCommit = true) { if (entity == null) { return false; } _context.Set().Attach(entity); _context.Set().Remove(entity); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task DeleteAsync(T entity, bool isCommit = true) { if (entity == null) { return await Task.Run(() => false); } _context.Set().Attach(entity); _context.Set().Remove(entity); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } #endregion #region 多模型 操作 public virtual bool SaveList(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return false; } entities.ToList().ForEach(item => { _context.Set().Add(item); }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task SaveListAsync(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } entities.ToList().ForEach(item => { _context.Set().Add(item); }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool SaveList(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return false; } var tmp = _context.ChangeTracker.Entries().ToList(); foreach (var x in tmp) { var properties = typeof(T).GetTypeInfo().GetProperties(); foreach (var y in properties) { var entry = x.Property(y.Name); entry.CurrentValue = entry.OriginalValue; entry.IsModified = false; y.SetValue(x.Entity, entry.OriginalValue); } x.State = EntityState.Unchanged; } entities.ToList().ForEach(item => { _context.Set().Add(item); }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task SaveListAsync(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } var tmp = _context.ChangeTracker.Entries().ToList(); foreach (var x in tmp) { var properties = typeof(T).GetTypeInfo().GetProperties(); foreach (var y in properties) { var entry = x.Property(y.Name); entry.CurrentValue = entry.OriginalValue; entry.IsModified = false; y.SetValue(x.Entity, entry.OriginalValue); } x.State = EntityState.Unchanged; } entities.ToList().ForEach(item => { _context.Set().Add(item); }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool UpdateList(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return false; } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Entry(item).State = EntityState.Modified; }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task UpdateListAsync(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Entry(item).State = EntityState.Modified; }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool UpdateList(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return false; } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Entry(item).State = EntityState.Modified; }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task UpdateListAsync(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Entry(item).State = EntityState.Modified; }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool Delete(Expression> predicate, bool isCommit = true) { IQueryable entry = (predicate == null) ? _context.Set().AsQueryable() : _context.Set().Where(predicate); List list = entry.ToList(); if (list != null && list.Count == 0) { return false; } list.ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task DeleteAsync(Expression> predicate, bool isCommit = true) { IQueryable entry = (predicate == null) ? _context.Set().AsQueryable() : _context.Set().Where(predicate); List list = entry.ToList(); if (list != null && list.Count == 0) { return await Task.Run(() => false); } list.ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool DeleteList(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return false; } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task DeleteListAsync(List entities, bool isCommit = true) { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } public virtual bool DeleteList(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return false; } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return _unitOfWork.SaveChanges() > 0; } else { return false; } } public virtual async Task DeleteListAsync(List entities, bool isCommit = true) where TEntity : class { if (entities == null || !entities.Any()) { return await Task.Run(() => false); } entities.ToList().ForEach(item => { _context.Set().Attach(item); _context.Set().Remove(item); }); if (isCommit) { return await Task.Run(() => _unitOfWork.SaveChanges() > 0); } else { return await Task.Run(() => false); } } #endregion #region 获取多条数据操作 public virtual IQueryable LoadAll(Expression> predicate) { return predicate != null ? _context.Set().Where(predicate) : _context.Set().AsQueryable(); } public virtual async Task> LoadAllAsync(Expression> predicate) { return predicate != null ? await Task.Run(() => _context.Set().Where(predicate)) : await Task.Run(() => _context.Set().AsQueryable()); } public virtual List LoadListAll(Expression> predicate) { return predicate != null ? _context.Set().Where(predicate).ToList() : _context.Set().AsQueryable().ToList(); } public virtual async Task> LoadListAllAsync(Expression> predicate) { return predicate != null ? await Task.Run(() => _context.Set().Where(predicate).ToList()) : await Task.Run(() => _context.Set().AsQueryable().ToList()); } public virtual IQueryable LoadAllBySql(string sql, params DbParameter[] para) { return _context.Set().FromSql(sql, para); } public virtual async Task> LoadAllBySqlAsync(string sql, params DbParameter[] para) { return await Task.Run(() => _context.Set().FromSql(sql, para)); } public virtual List LoadListAllBySql(string sql, params DbParameter[] para) { return _context.Set().FromSql(sql, para).Cast().ToList(); } public virtual async Task> LoadListAllBySqlAsync(string sql, params DbParameter[] para) { return await Task.Run(() => _context.Set().FromSql(sql, para).Cast().ToList()); } public virtual List QueryEntity(Expression> where, Expression> orderby, Expression> selector, bool isAsc) where TEntity : class where TResult : class { IQueryable query = _context.Set(); if (where != null) { query = query.Where(where); } if (orderby != null) { query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); } if (selector == null) { return query.Cast().ToList(); } return query.Select(selector).ToList(); } public virtual async Task> QueryEntityAsync(Expression> where, Expression> orderby, Expression> selector, bool isAsc) where TEntity : class where TResult : class { IQueryable query = _context.Set(); if (where != null) { query = query.Where(where); } if (orderby != null) { query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); } if (selector == null) { return await Task.Run(() => query.Cast().ToList()); } return await Task.Run(() => query.Select(selector).ToList()); } public virtual List QueryObject(Expression> where, Expression> orderby, Func, List> selector, bool isAsc) where TEntity : class { IQueryable query = _context.Set(); if (where != null) { query = query.Where(where); } if (orderby != null) { query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); } if (selector == null) { return query.ToList(); } return selector(query); } public virtual async Task> QueryObjectAsync(Expression> where, Expression> orderby, Func, List> selector, bool isAsc) where TEntity : class { IQueryable query = _context.Set(); if (where != null) { query = query.Where(where); } if (orderby != null) { query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby); } if (selector == null) { return await Task.Run(() => query.ToList()); } return await Task.Run(() => selector(query)); } public virtual dynamic QueryDynamic(Expression> where, Expression> orderby, Func, List> selector, bool isAsc) where TEntity : class { //List list = QueryObject // (where, orderby, selector, isAsc); //return Common.JsonHelper.JsonConvert.JsonClass(list); throw new NotImplementedException(); } public virtual async Task QueryDynamicAsync(Expression> where, Expression> orderby, Func, List> selector, bool isAsc) where TEntity : class { // List list = QueryObject //(where, orderby, selector, isAsc); // return await Task.Run(() => Common.JsonHelper.JsonConvert.JsonClass(list)); throw new NotImplementedException(); } #endregion #region 验证是否存在 public virtual bool IsExist(Expression> predicate) { var entry = _context.Set().Where(predicate); return (entry.Any()); } public virtual async Task IsExistAsync(Expression> predicate) { var entry = _context.Set().Where(predicate); return await Task.Run(() => entry.Any()); } public virtual bool IsExist(string sql, params DbParameter[] para) { return _context.Database.ExecuteSqlCommand(sql, para) > 0; } public virtual async Task IsExistAsync(string sql, params DbParameter[] para) { return await Task.Run(() => _context.Database.ExecuteSqlCommand(sql, para) > 0); } #endregion public virtual Page PageList(int pageindex, int pagesize, Func, IOrderedQueryable> orderBy, Expression> selector, out int total, Expression> where = null) { int row = (--pageindex) * pagesize; if (where != null) { total = _context.Set().Where(where).Count(); var data = orderBy(_context.Set().Where(where)) .Skip(row) .Take(pagesize) .Select(selector).ToList(); var res = new Page(data, pagesize, total); return res; } else { total = _context.Set().Count(); var data = orderBy(_context.Set()).Skip(row) .Take(pagesize) .Select(selector).ToList(); var res = new Page(data, pagesize, total); return res; } } public virtual Page PageList(int pageindex, int pagesize, Expression> predicate, Expression> orderPredicate, bool isAsc) { var data = _context.Set().AsQueryable(); if (predicate != null) { data = data.Where(predicate); } var count = data.Count(); if (isAsc) { data = data.OrderBy(orderPredicate).Skip((pageindex - 1) * pagesize).Take(pagesize); return new Page(data.ToList(), pagesize, count); } else { data = data.OrderByDescending(orderPredicate).Skip((pageindex - 1) * pagesize).Take(pagesize); return new Page(data.ToList(), pagesize, count); } } } }