using BusinessLogic.Interfaces.Repositories; using DataAccess.Extensions; using DataAccess.Persistence; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Linq.Expressions; using Tanneryd.BulkOperations.EF6; using Tanneryd.BulkOperations.EF6.Model; namespace DataAccess.Repositories { public class Repository : IRepository where TEntity : class { protected readonly IncomeDbContext IncomeDbContext; private IList>> _filters = new List>>(); public IEnumerable>> Filters { get { return _filters; } } public void AddFilter(Expression> filter) { _filters.Add(filter); } protected IQueryable DbSet { get { return (_filters.Any()) ? IncomeDbContext.Set().AsQueryable().ApplyFilters(_filters) : IncomeDbContext.Set().AsQueryable(); } } public Repository(IncomeDbContext context) { IncomeDbContext = context; } public IEnumerable GetAll() { return DbSet.AsQueryable().ApplyFilters(_filters).ToList(); } public IEnumerable Find(Expression> predicate) { return DbSet.AsQueryable().ApplyFilters(_filters).Where(predicate); } public TEntity SingleOrDefault(Expression> predicate) { return DbSet.AsQueryable().ApplyFilters(_filters).SingleOrDefault(predicate); } public void Add(TEntity entity) { IncomeDbContext.Set().Add(entity); } public void AddRange(IEnumerable entities) { IncomeDbContext.Set().AddRange(entities); } public void Remove(TEntity entity) { IncomeDbContext.Set().Remove(entity); } public void RemoveRange(IEnumerable entities) { IncomeDbContext.Set().RemoveRange(entities); } public void BulkInsert(IEnumerable entities) { DbContextExtensions.BulkInsertAll( IncomeDbContext, new BulkInsertRequest { Entities = entities.ToList(), }); } public void BulkUpdate(IEnumerable entities) { var tableMetadata = IncomeDbContext.TableMetadataForEntityType(typeof(TEntity)); DbContextExtensions.BulkUpdateAll( IncomeDbContext, new BulkUpdateRequest() { Entities = entities.ToList(), UpdatedColumnNames = tableMetadata.NonKeyFields.ToArray() }); } public void BulkUpdate(IEnumerable entities, IEnumerable fieldExclusions) { var tableMetadata = IncomeDbContext.TableMetadataForEntityType(typeof(TEntity)); DbContextExtensions.BulkUpdateAll( IncomeDbContext, new BulkUpdateRequest() { Entities = entities.ToList(), UpdatedColumnNames = tableMetadata.NonKeyFields.Except(fieldExclusions).ToArray() }); } public IEnumerable BulkSelectNotExisting(IEnumerable entities) { var tableMetadata = IncomeDbContext.TableMetadataForEntityType(typeof(TEntity)); return DbContextExtensions.BulkSelectNotExisting( IncomeDbContext, new BulkSelectRequest() { Items = entities.ToList(), KeyPropertyMappings = tableMetadata.Keys.Select(x => new KeyPropertyMapping() { EntityPropertyName = x, ItemPropertyName = x }).ToArray() }); } } }