using Microsoft.EntityFrameworkCore; using ODCWeb.DataAccess.Data; using ODCWeb.DataAccess.Repository.IRepository; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace ODCWeb.DataAccess.Repository { public class Repository : IRepository where T : class { private readonly ApplicationDbContext _db; internal DbSet dbSet; public Repository(ApplicationDbContext db) { _db = db; this.dbSet = _db.Set(); //to populate category name in index (fetching it from category model) (but we will prefer it inside Get All method) //_db.Products.Include(u => u.Category).Include(u=>u.SomeOtherProperty); } public void Add(T entity) { dbSet.Add(entity); } public T Get(Expression> filter, string? includeProperties = null) { IQueryable query = dbSet; query = query.Where(filter); if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return query.FirstOrDefault(); } public async Task GetAsync(Expression> filter, string? includeProperties = null) { IQueryable query = dbSet; query = query.Where(filter); if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return await query.FirstOrDefaultAsync(); } public IEnumerable Where(Expression> filter, string? includeProperties = null) { IQueryable query = dbSet; query = query.Where(filter); if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return query.ToList(); } public async Task> WhereAsync(Expression> filter, string? includeProperties = null) { IQueryable query = dbSet; query = query.Where(filter); if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return await query.ToListAsync(); } public IEnumerable GetAll(string? includeProperties = null) { IQueryable query = dbSet; if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return query.ToList(); } public async Task> GetAllAsync(string? includeProperties = null) { IQueryable query = dbSet; if (!string.IsNullOrEmpty(includeProperties)) { foreach (var includeProp in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProp); } } return await query.ToListAsync(); } public void Remove(T entity) { dbSet.Remove(entity); } public void RemoveRange(IEnumerable entities) { dbSet.RemoveRange(entities); } } }