using EFCore.BulkExtensions; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Storage; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ApiTools.Core { public abstract class BaseRepository where TEntity : CommonEntity, new() where TDbContextLocator : class, IDbContextLocator { public readonly IRepository rep; public readonly CurrentLogier logier; public BaseRepository( IRepository rep) { this.rep = rep; logier = JwtUtils.GetCurrentLogier(); } public virtual IQueryable GetQueryableIgnoreFilter(bool noTracking = true) { return rep.GetQueryable(noTracking); } /// /// 获取查询 /// /// /// public virtual IQueryable GetQueryable(bool noTracking = true) { return rep.GetQueryable(noTracking); } /// /// 获取查询 /// /// /// /// public virtual IQueryable GetQueryable( bool noTracking, Func, IQueryable> query) { var q = GetQueryable(false); if (query != null) { q = query(q); } return q; } /// /// 获取实体 /// /// /// /// /// public virtual Task Get( Guid id, Func, IQueryable> query = null, CancellationToken cancellationToken = default) { return GetQueryable(false, query) .Where(it => it.Id == id) .FirstOrDefaultAsync(cancellationToken); } /// /// 获取实体 /// /// /// /// /// public virtual Task> Get( List ids, Func, IQueryable> query = null, CancellationToken cancellationToken = default) { return GetQueryable(false, query) .Where(it => ids.Contains(it.Id)) .ToListAsync(cancellationToken); } /// /// 查询选择器数据 /// /// /// /// /// /// /// /// /// public async Task>> GetSelect( SelectQuery request, Func getValue, Func getLabel, Func, IQueryable> query = null, CancellationToken cancellationToken = default) { var q = GetQueryable(); if (query != null) q = query(q); else q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime); var models = await q .ProjectToType() .ToListAsync(cancellationToken); var options = new List>(); foreach (var model in models) { var option = new SelectOption(); option.Data = model; option.Value = getValue(model); option.Label = getLabel(model); options.Add(option); } return options; } public async Task GetDetail( Func, IQueryable> query = null, CancellationToken cancellationToken = default) { var model = await GetQueryable(false, query) .ProjectToType() .FirstOrDefaultAsync(cancellationToken); if (model == null) { var summary = await typeof(TEntity).GetSummary(); throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "信息"}"); } return model; } /// /// 设置是否禁用 /// /// /// /// /// public async Task SetIsDisabled( SetIsDisabledCommand request, Func, IQueryable> query = null, CancellationToken cancellationToken = default) { var q = GetQueryable(false); if (query != null) q = query(q); var entities = await q .Where(it => request.Ids.Contains(it.Id)) .ToListAsync(); var isDisabledProperty = typeof(TEntity).GetProperty("IsDisabled", typeof(bool)); foreach (var entity in entities) { isDisabledProperty.SetValue(entity, request.IsDisabled); } await UpdateAsync(entities); return entities.Count; } /// /// 删除数据 /// /// /// /// /// public async Task DeleteData( DeleteDataCommand request, Func, IQueryable> query = null, CancellationToken cancellationToken = default) { var q = GetQueryable(false); if (query != null) q = query(q); var entities = await q .Where(it => request.Ids.Contains(it.Id)) .ToListAsync(cancellationToken); return entities.Any() ? await rep.DeleteNowAsync(entities, cancellationToken) : 0; } /// /// 更新数据 /// /// /// /// /// /// /// public async Task UpdateData( IQueryable q, TRequest request, Action update = null, CancellationToken cancellationToken = default) { var entity = await q.FirstOrDefaultAsync(); if (entity == null) { var summary = await typeof(TEntity).GetSummary(); throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "信息"}"); } if (update != null) update(entity); else request.Adapt(entity); await rep.UpdateAsync(entity); return entity.Id; } /// /// 保存数据 /// /// /// /// /// /// /// /// public async Task SaveData( TRequest request, Func, IQueryable> query = null, Expression> checkExist = null, Action update = null, CancellationToken cancellationToken = default) where TRequest : SaveDataCommand, new() { var xmlDoc = await XmlDocUtils.GetXmlDocAsync(); var summary = await typeof(TEntity).GetSummary(xmlDoc); if (checkExist != null && await GetQueryableIgnoreFilter().AnyAsync(checkExist)) throw Oops.Oh(EnumErrorCodeType.s405, $"{summary ?? "信息"}"); if (request.Id.HasValue) { var q = GetQueryable(false); if (query != null) q = query(q); var entity = await q.FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "信息"}"); if (update != null) update(entity); else request.Adapt(entity); await rep.UpdateAsync(entity); return entity; } else { var entity = new TEntity(); if (update != null) update(entity); else request.Adapt(entity); await rep.InsertAsync(entity); return entity; } } public virtual Task> SqlQueriesAsync(string sql, object model, CancellationToken cancellationToken = default) { return rep.SqlQueriesAsync(sql, model, cancellationToken); } public virtual IDbContextTransaction BeginTransaction() { return rep.Database.BeginTransaction(); } public virtual Task InsertAsync(TEntity entity, CancellationToken cancellationToken = default) { return rep.InsertAsync(entity, cancellationToken: cancellationToken); } public virtual Task InsertNowAsync(TEntity entity, CancellationToken cancellationToken = default) { return rep.InsertNowAsync(entity, cancellationToken: cancellationToken); } public virtual Task InsertAsync(List entities, CancellationToken cancellationToken = default) { return rep.InsertAsync(entities, cancellationToken); } public virtual Task InsertNowAsync(List entities, CancellationToken cancellationToken = default) { return rep.InsertNowAsync(entities, cancellationToken); } public virtual async Task BulkInsertAsync(List entities, CancellationToken cancellationToken = default) { await rep.Context.BulkInsertAsync(entities, cancellationToken: cancellationToken); } public virtual Task UpdateAsync(TEntity entity) { return rep.UpdateAsync(entity); } public virtual Task UpdateNowAsync(TEntity entity) { return rep.UpdateNowAsync(entity); } public virtual Task UpdateAsync(List entities) { return rep.UpdateAsync(entities); } public virtual Task UpdateNowAsync(List entities) { return rep.UpdateNowAsync(entities); } public virtual Task DeleteAsync(TEntity entity) { return rep.DeleteAsync(entity); } public virtual Task DeleteNowAsync(TEntity entity, CancellationToken cancellationToken = default) { return rep.DeleteNowAsync(entity, cancellationToken); } public virtual Task DeleteAsync(List entities) { return rep.DeleteAsync(entities); } public virtual Task DeleteNowAsync(List entities, CancellationToken cancellationToken = default) { return rep.DeleteNowAsync(entities, cancellationToken); } public virtual Task SaveNowAsync() { return rep.SaveNowAsync(); } } }