#if NET48 using System.Data.Entity; #else using Microsoft.EntityFrameworkCore; #endif using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using AutoMapper; using ECMJobRunner.Domain.Interfaces; using ECMJobRunner.Infrastructure.Data; namespace ECMJobRunner.Infrastructure.Repositories { /// /// Generic repository implementation for Entity Framework /// Uses AutoMapper for DTO mapping /// /// Entity type public class Repository : IRepository where TEntity : class { /// /// Database context /// protected readonly JobRunnerDbContext _context; /// /// DbSet for the entity /// protected readonly DbSet _dbSet; /// /// AutoMapper instance for DTO mapping /// protected readonly IMapper _mapper; /// /// Constructor /// public Repository(JobRunnerDbContext context, IMapper mapper) { _context = context ?? throw new ArgumentNullException(nameof(context)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); _dbSet = context.Set(); } /// public virtual async Task GetByIdAsync(long id, CancellationToken cancellationToken = default) { #if NET48 return await _dbSet.FindAsync(cancellationToken, id); #else return await _dbSet.FindAsync(new object[] { id }, cancellationToken); #endif } /// public virtual async Task> GetAllAsync(CancellationToken cancellationToken = default) { return await _dbSet.ToListAsync(cancellationToken); } /// public virtual async Task> FindAsync(Expression> predicate, CancellationToken cancellationToken = default) { return await _dbSet.Where(predicate).ToListAsync(cancellationToken); } /// public virtual async Task SingleOrDefaultAsync(Expression> predicate, CancellationToken cancellationToken = default) { return await _dbSet.SingleOrDefaultAsync(predicate, cancellationToken); } /// public virtual async Task AddAsync(TDto dto, CancellationToken cancellationToken = default) where TDto : class { if (dto == null) throw new ArgumentNullException(nameof(dto)); var entity = _mapper.Map(dto); #if NET48 _dbSet.Add(entity); await Task.CompletedTask; #else await _dbSet.AddAsync(entity, cancellationToken); #endif await SaveChangesAsync(cancellationToken); return entity; } /// public virtual async Task AddRangeAsync(IEnumerable dtos, CancellationToken cancellationToken = default) where TDto : class { if (dtos == null) throw new ArgumentNullException(nameof(dtos)); var dtoList = dtos.ToList(); if (!dtoList.Any()) return 0; var entities = _mapper.Map>(dtoList); #if NET48 _dbSet.AddRange(entities); await Task.CompletedTask; #else await _dbSet.AddRangeAsync(entities, cancellationToken); #endif return await SaveChangesAsync(cancellationToken); } /// public virtual async Task UpdateAsync(Expression> predicate, TDto dto, CancellationToken cancellationToken = default) where TDto : class { if (dto == null) throw new ArgumentNullException(nameof(dto)); var entities = await _dbSet.Where(predicate).ToListAsync(cancellationToken); if (!entities.Any()) return 0; foreach (var entity in entities) { _mapper.Map(dto, entity); } return await SaveChangesAsync(cancellationToken); } /// public virtual async Task UpdateSingleAsync(Expression> predicate, TDto dto, CancellationToken cancellationToken = default) where TDto : class { if (dto == null) throw new ArgumentNullException(nameof(dto)); var entity = await SingleOrDefaultAsync(predicate, cancellationToken); if (entity == null) return false; _mapper.Map(dto, entity); await SaveChangesAsync(cancellationToken); return true; } /// public virtual async Task DeleteAsync(Expression> predicate, CancellationToken cancellationToken = default) { var entities = await _dbSet.Where(predicate).ToListAsync(cancellationToken); if (!entities.Any()) return 0; _dbSet.RemoveRange(entities); return await SaveChangesAsync(cancellationToken); } /// public virtual async Task DeleteSingleAsync(Expression> predicate, CancellationToken cancellationToken = default) { var entity = await SingleOrDefaultAsync(predicate, cancellationToken); if (entity == null) return false; _dbSet.Remove(entity); await SaveChangesAsync(cancellationToken); return true; } /// public virtual async Task SaveChangesAsync(CancellationToken cancellationToken = default) { #if NET48 return await _context.SaveChangesAsync(); #else return await _context.SaveChangesAsync(cancellationToken); #endif } } }