using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using UserManagement.Common.UnitOfWork; using UserManagement.Data; using System.Threading.Tasks; using System.Threading; namespace UserManagement.Common.GenericRespository { public class GenericRepository : IGenericRepository where TC : class where TContext : DbContext { protected readonly TContext Context; internal readonly DbSet DbSet; protected IUnitOfWork _uow; protected GenericRepository(IUnitOfWork uow ) { Context = uow.Context; this._uow = uow; DbSet = Context.Set(); } public IQueryable All => Context.Set(); public void Add(TC entity) { Context.Add(entity); } public IQueryable AllIncluding(params Expression>[] includeProperties) { return GetAllIncluding(includeProperties); } //public async Task> AllIncludingAsync(params Expression>[] includeProperties) //{ // var query = GetAllIncluding(includeProperties); // IEnumerable results = await query.ToListAsync(); // return results; //} public IQueryable FindByInclude(Expression> predicate, params Expression>[] includeProperties) { var query = GetAllIncluding(includeProperties); return query.Where(predicate); } //public async Task> FindByIncludeAsync(Expression> predicate, params Expression>[] includeProperties) //{ // var query = GetAllIncluding(includeProperties); // IEnumerable results = await query.Where(predicate).ToListAsync(); // return results; //} //public IQueryable FindByInclude(Expression> predicate, params Expression>[] includeProperties) //{ // var query = GetAllIncluding(includeProperties); // return query.Where(predicate); //} public IQueryable FindBy(Expression> predicate) { IQueryable queryable = DbSet.AsNoTracking(); return queryable.Where(predicate); } //public IQueryable FindOnly(Expression> predicate) //{ // IQueryable queryable = DbSet.AsNoTracking(); // return queryable.Where(predicate); //} //public async Task> FindByAsync(Expression> predicate) //{ // IQueryable queryable = DbSet.AsNoTracking(); // IEnumerable results = await queryable.Where(predicate).ToListAsync(); // return results; //} private IQueryable GetAllIncluding(params Expression>[] includeProperties) { IQueryable queryable = DbSet.AsNoTracking(); return includeProperties.Aggregate (queryable, (current, includeProperty) => current.Include(includeProperty)); } public TC Find(Guid id) { return Context.Set().Find(id); } public async Task FindAsync(Guid id, CancellationToken cancellationToken) { return await Context.Set().FindAsync([id], cancellationToken: cancellationToken); } public virtual void Update(TC entity) { Context.Update(entity); } public virtual void UpdateRange(List entities) { Context.UpdateRange(entities); } public void RemoveRange(IEnumerable lstEntities) { Context.Set().RemoveRange(lstEntities); } public void AddRange(IEnumerable lstEntities) { Context.Set().AddRange(lstEntities); } public void InsertUpdateGraph(TC entity) { Context.Set().Add(entity); //Context.ApplyStateChanges(user); } public virtual void Delete(Guid id) { if (Context.Set().Find(id) is BaseEntity entity) { entity.IsDeleted = true; Context.Update(entity); } } public virtual void Delete(TC entityData) { var entity = entityData as BaseEntity; entity.IsDeleted = true; Context.Update(entity); } public virtual void Remove(TC entity) { Context.Remove(entity); } public void Dispose() { Context.Dispose(); } } }