using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { /// /// CRUD сервис для работы с БД /// /// /// public class CrudServiceBase : ICrudService where TDto : AsbCloudApp.Data.IId where TEntity : class, AsbCloudDb.Model.IId { protected readonly IAsbCloudDbContext dbContext; protected readonly DbSet dbSet; protected readonly Func> GetQuery; public CrudServiceBase(IAsbCloudDbContext context) { this.dbContext = context; dbSet = context.Set(); GetQuery = () => dbSet; } public CrudServiceBase(IAsbCloudDbContext dbContext, ISet includes) { this.dbContext = dbContext; dbSet = dbContext.Set(); GetQuery = () => { IQueryable query = dbSet; foreach (var include in includes) query = query.Include(include); return query; }; } public CrudServiceBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) { this.dbContext = context; dbSet = context.Set(); GetQuery = () => makeQuery(dbSet); } /// public virtual async Task> GetAllAsync(CancellationToken token = default) { var entities = await GetQuery() //.OrderBy(e => e.Id) .AsNoTracking() .ToListAsync(token) .ConfigureAwait(false); var dtos = entities.Select(Convert).ToList(); return dtos; } /// public virtual async Task GetAsync(int id, CancellationToken token = default) { var entity = await GetQuery() .AsNoTracking() .FirstOrDefaultAsync(e => e.Id == id, token) .ConfigureAwait(false); if (entity == default) return default; var dto = Convert(entity); return dto; } /// public virtual TDto? Get(int id) { var entity = GetQuery() .AsNoTracking() .FirstOrDefault(e => e.Id == id); if (entity == default) return default; var dto = Convert(entity); return dto; } /// public virtual async Task InsertAsync(TDto item, CancellationToken token = default) { var entity = Convert(item); entity.Id = 0; dbSet.Add(entity); await dbContext.SaveChangesAsync(token); return entity.Id; } /// public virtual Task InsertRangeAsync(IEnumerable items, CancellationToken token = default) { if (!items.Any()) return Task.FromResult(0); var entities = items.Select(i => { var entity = Convert(i); entity.Id = 0; return entity; }); dbSet.AddRange(entities); return dbContext.SaveChangesAsync(token); } /// public virtual async Task UpdateAsync(TDto item, CancellationToken token = default) { var existingEntity = await dbSet .AsNoTracking() .FirstOrDefaultAsync(e => e.Id == item.Id, token) .ConfigureAwait(false); if (existingEntity is null) return ICrudService.ErrorIdNotFound; var entity = Convert(item); var entry = dbSet.Update(entity); await dbContext.SaveChangesAsync(token); return entry.Entity.Id; } /// public virtual Task DeleteAsync(int id, CancellationToken token = default) { var entity = dbSet .AsNoTracking() .FirstOrDefault(e => e.Id == id); if (entity == default) return Task.FromResult(ICrudService.ErrorIdNotFound); dbSet.Remove(entity); return dbContext.SaveChangesAsync(token); } protected virtual TDto Convert(TEntity src) => src.Adapt(); protected virtual TEntity Convert(TDto src) => src.Adapt(); } #nullable disable }