定义 IRepositorys接口
//泛型参数:TEntity为仓储的实体类型,TKey为仓储的主键类型
public interface IRepositorys<TEntity, TKey> where TEntity : Entity<TKey>
{
//新增实体
Task<TEntity> AddAsync(TEntity entity);
//更新实体
Task<TEntity> UpdateAsync(TEntity entity);
//删除实体
Task DeleteAsync(TEntity entity);//删除一个实体
Task DeleteAsync(Expression<Func<TEntity, bool>> predicate);//删除符合条件的多个实体
//查询实体
Task<List<TEntity>> GetAllListAsync();//查询所有
Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate);//查询指定条件的多条返回List
IQueryable<TEntity> GetAll(); //查询多条
IQueryable<TEntity> GetAll(Expression<Func<TEntity, bool>> predicate); //查询指定条件的多条
Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate);//查询指定条件的一条,如果没有,返回null
Task<int> CountAsync();//查询全部总数
Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate);//查询指定条件总数
}
定义 IRepositorys接口实现类Repositorys
public class Repositorys<TEntity, TKey> : IRepositorys<TEntity, TKey> where TEntity : Entity<TKey>
{
//准备①:注入DbContext
private readonly AppDbContext dbContext;
public Repositorys(AppDbContext dbContext)
{
this.dbContext = dbContext;
}
//准备②:获取泛型实体的DbSet,注意使用虚方法,传入具体的实体类型时,重写这个DbSet
public virtual DbSet<TEntity> dbSet => dbContext.Set<TEntity>();
//准备③:检查实体是否处理跟踪状态,如果是,则返回实体;如果不是,则添加跟踪状态
protected virtual void AttachIfNot(TEntity entity)
{
var entry = dbContext.ChangeTracker.Entries().FirstOrDefault(e => e.Entity == entity);
if (entry != null)
{
return;
}
dbSet.Attach(entity);
}
//实现新增实体
public async Task<TEntity> AddAsync(TEntity entity)
{
var entityResult = await dbSet.AddAsync(entity);
await dbContext.SaveChangesAsync();
return entityResult.Entity;
}
//实现更新实体。ctx.Entry(entity).State获取实体跟踪状态
public async Task<TEntity> UpdateAsync(TEntity entity)
{
AttachIfNot(entity);
dbContext.Entry(entity).State = EntityState.Modified;
await dbContext.SaveChangesAsync();
return entity;
}
//实体删除实体
//删除一个实体
public async Task DeleteAsync(TEntity entity)
{
AttachIfNot(entity);
var entityResult = dbSet.Remove(entity);
await dbContext.SaveChangesAsync();
}
//删除指定条件的多个实体。dbSet.AsQueryable()方法获取实体的Queryable集合
public async Task DeleteAsync(Expression<Func<TEntity, bool>> predicate)
{
foreach (var entity in dbSet.AsQueryable().Where(predicate).ToList())
{
await DeleteAsync(entity);
};
}
//实现查询
//查询所有
public async Task<List<TEntity>> GetAllListAsync()
{
return await dbSet.AsQueryable().ToListAsync();
}
//查询指定条件的多条返回List集合
public async Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate)
{
return await dbSet.AsQueryable().Where(predicate).ToListAsync();
}
//查询多条
public IQueryable<TEntity> GetAll()
{
return dbSet.AsQueryable();
//return await dbSet.AsQueryable().Where(predicate).ToListAsync().AsQueryable();
}
//查询指定条件的多条
public IQueryable<TEntity> GetAll(Expression<Func<TEntity, bool>> predicate)
{
return dbSet.AsQueryable().Where(predicate);
//return await dbSet.AsQueryable().Where(predicate).ToListAsync().AsQueryable();
}
//查询指定条件的首条
public async Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
return await dbSet.AsQueryable().FirstOrDefaultAsync(predicate);
}
//实现查询总数
public async Task<int> CountAsync()
{
return await dbSet.AsQueryable().CountAsync();
}
//查询指定条件的总数
public async Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate)
{
return await dbSet.AsQueryable().Where(predicate).CountAsync();
}
}