То, что вы ищете, это общий c класс репозитория или лучше назвать его generi c класс доступа к данным, у меня уже есть суть для такого рода действий и я могу управлять всем, что вам нужно, вы можете удалить дополнительные действия, если они вам не нужны.
public interface IEntityRepository<TEntity, TKey>
where TEntity : class, Entity.IEntity<TKey>
where TKey : IComparable
{
#region Utility
long Count();
Task<long> CountAsync();
Task<bool> AnyAsync();
Task<bool> AnyAsync(Expression<Func<TEntity, bool>> predicate,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
bool AnyLocal(Func<TEntity, bool> predicate);
#endregion
#region Delete
Task<(bool success, TEntity obj)> DeleteAsync(TKey Id);
Task<(bool success, IEnumerable<TEntity> objs)> DeleteListAsync(IEnumerable<TKey> Ids);
Task<(bool success, IEnumerable<TEntity> objs)> DeleteListAsync(IEnumerable<Guid> guids);
Task<(bool success, IEnumerable<TEntity> objs)> PhysicalDeleteListAsync(IEnumerable<TKey> Ids);
Task<(bool success, IEnumerable<TEntity> objs)> PhysicalDeleteListAsync(IEnumerable<Guid> guids);
Task BatchDeleteAsync(IEnumerable<Guid> guids);
#endregion
#region Update
Task<(bool success, TEntity obj)> UpdateAsync(TEntity input);
Task<(bool success, IEnumerable<TEntity> objs)> UpdateListAsync(IEnumerable<TEntity> input);
Task BatchUpdateAsync(IEnumerable<TEntity> input);
#endregion
#region Create
Task<(bool success, TEntity obj)> CreateAsync(TEntity input);
Task<(bool success, IEnumerable<TEntity> objs)> CreateListAsync(IEnumerable<TEntity> input);
Task BatchInsertAsync(IEnumerable<TEntity> input);
#endregion
#region Get
Task<TEntity> GetByIdAsync(TKey Id, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
Task<TEntity> GetByGuidAsync(Guid Id, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
Task<IEnumerable<TEntity>> GetAllAsync(Expression<Func<TEntity, bool>> predicate = null,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
Task<IEnumerable<TEntity>> GetListByIdsAsync(IEnumerable<TKey> ids,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
Task<IEnumerable<TEntity>> GetListByGuidsAsync(IEnumerable<Guid> guids,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
#endregion
}
gist.github: https://gist.github.com/devlnull/cbcc3f927c36eb296e58f0d1be3e4ba2