using System.Diagnostics; using System.Linq.Expressions; using DMS.Core.Helper; using DMS.Core.Models; using DMS.Infrastructure.Data; using SqlSugar; namespace DMS.Infrastructure.Repositories; /// /// 通用仓储基类,封装了对实体对象的常用 CRUD 操作。 /// /// 实体类型,必须是引用类型且具有无参构造函数。 public abstract class BaseRepository where TEntity : class, new() { private readonly SqlSugarDbContext _dbContext; /// /// 初始化 BaseRepository 的新实例。 /// /// SqlSugar 数据库上下文,用于数据库操作。 protected BaseRepository(SqlSugarDbContext dbContext) { _dbContext = dbContext; } /// /// 获取当前事务的 SqlSugarClient 实例,用于数据库操作。 /// protected SqlSugarClient Db { get { return _dbContext.GetInstance(); } } /// /// 异步添加一个新实体。 /// /// 要添加的实体对象。 /// 返回已添加的实体对象(可能包含数据库生成的主键等信息)。 public virtual async Task AddAsync(TEntity entity) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Insertable(entity) .ExecuteReturnEntityAsync(); stopwatch.Stop(); NlogHelper.Info($"Add {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步更新一个现有实体。 /// /// 要更新的实体对象。 /// 返回受影响的行数。 public virtual async Task UpdateAsync(TEntity entity) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Updateable(entity) .ExecuteCommandAsync(); stopwatch.Stop(); NlogHelper.Info($"Update {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步删除一个实体。 /// /// 要删除的实体对象。 /// 返回受影响的行数。 public virtual async Task DeleteAsync(TEntity entity) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Deleteable(entity) .ExecuteCommandAsync(); stopwatch.Stop(); NlogHelper.Info($"Delete {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步获取所有实体。 /// /// 返回包含所有实体的列表。 public virtual async Task> GetAllAsync() { var stopwatch = new Stopwatch(); stopwatch.Start(); var entities = await Db.Queryable() .ToListAsync(); stopwatch.Stop(); NlogHelper.Info($"GetAll {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return entities; } /// /// 异步根据主键 ID 获取单个实体。 /// /// 实体的主键 ID。 /// 返回找到的实体,如果未找到则返回 null。 public virtual async Task GetByIdAsync(int id) { var stopwatch = new Stopwatch(); stopwatch.Start(); var entity = await Db.Queryable() .In(id) .FirstAsync(); stopwatch.Stop(); NlogHelper.Info($"GetById {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return entity; } /// /// 异步根据主键 ID 列表批量删除实体。 /// /// 要删除的实体主键 ID 列表。 /// 返回受影响的行数。 public virtual async Task DeleteByIdsAsync(List ids) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Deleteable() .In(ids) .ExecuteCommandAsync(); stopwatch.Stop(); NlogHelper.Info($"DeleteByIds {typeof(TEntity).Name}, Count: {ids.Count}, 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步根据指定条件获取单个实体。 /// /// 查询条件的 Lambda 表达式。 /// 返回满足条件的第一个实体,如果未找到则返回 null。 public virtual async Task GetByConditionAsync(Expression> expression) { var stopwatch = new Stopwatch(); stopwatch.Start(); var entity = await Db.Queryable() .FirstAsync(expression); stopwatch.Stop(); NlogHelper.Info($"GetByCondition {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return entity; } /// /// 异步判断是否存在满足条件的实体。 /// /// 查询条件的 Lambda 表达式。 /// 如果存在则返回 true,否则返回 false。 public virtual async Task ExistsAsync(Expression> expression) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Queryable() .AnyAsync(expression); stopwatch.Stop(); NlogHelper.Info($"Exists {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步开始数据库事务。 /// /// 表示异步操作的任务。 public async Task BeginTranAsync() { await Db.BeginTranAsync(); } /// /// 异步提交数据库事务。 /// /// 表示异步操作的任务。 public async Task CommitTranAsync() { await Db.CommitTranAsync(); } /// /// 异步回滚数据库事务。 /// /// 表示异步操作的任务。 public async Task RollbackTranAsync() { await Db.RollbackTranAsync(); } /// /// 异步获取指定数量的实体。 /// /// 要获取的实体数量。 /// 包含指定数量实体对象的列表。 protected async Task> TakeAsync(int number) { var stopwatch = new Stopwatch(); stopwatch.Start(); var entity = await Db.Queryable().Take(number).ToListAsync(); stopwatch.Stop(); NlogHelper.Info($"TakeAsync {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return entity; } public async Task AddBatchAsync(List entities) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await Db.Insertable(entities).ExecuteCommandAsync(); stopwatch.Stop(); NlogHelper.Info($"AddBatchAsync {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms"); return result > 0; } }