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
}