public abstract class BaseRepository : IRepository where TEntity : class { protected readonly DbContext _context; protected readonly DbSet _dbSet; protected BaseRepository(DbContext context) { _context = context; _dbSet = context.Set(); } public TEntity Get(int Id) { return _dbSet.Find(Id); } public IQueryable Get(Expression> filter = null, Func, IOrderedQueryable> orderBy = null, Type[] includePropertyTypes = null) { IQueryable query = _dbSet; if (filter != null) query = query.Where(filter); //note: can be here if (includePropertyTypes != null) { IEnumerable includePropertyNames = includePropertyTypes.Select(t => t.Name); foreach (var propertyName in includePropertyNames) query.Include(propertyName); } if (orderBy != null) query = orderBy(query); return query; } public void Add(TEntity entity) { _dbSet.Add(entity); } public void Update(TEntity entity) { _dbSet.Attach(entity); _context.Entry(entity).State = EntityState.Modified; } public void Remove(TEntity entity) { if (_context.Entry(entity).State == EntityState.Detached) _dbSet.Attach(entity); _dbSet.Remove(entity); } }