using AutoMapper; using DMS.Core.Helper; using DMS.Infrastructure.Interfaces; using DMS.Infrastructure.Data; using SqlSugar; using System.Diagnostics; using System.Linq.Expressions; namespace DMS.Infrastructure.Repositories; /// /// 通用仓储基类,封装了对实体对象的常用 CRUD 操作。 /// /// 实体类型,必须是引用类型且具有无参构造函数。 public abstract class BaseRepository where TEntity : class, new() { private readonly SqlSugarDbContext _dbContext; /// /// 获取当前事务的 SqlSugarClient 实例,用于数据库操作。 /// protected SqlSugarClient Db => _dbContext.GetInstance(); /// /// 初始化 BaseRepository 的新实例。 /// /// 事务管理对象,通过依赖注入提供。 protected BaseRepository(SqlSugarDbContext dbContext) { this._dbContext = dbContext; } /// /// 异步添加一个新实体。 /// /// 要添加的实体对象。 /// 返回已添加的实体对象(可能包含数据库生成的主键等信息)。 public virtual async Task AddAsync(TEntity entity) { Stopwatch 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) { Stopwatch 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) { Stopwatch 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() { Stopwatch 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) { Stopwatch 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; } /// /// 异步根据指定条件获取单个实体。 /// /// 查询条件的 Lambda 表达式。 /// 返回满足条件的第一个实体,如果未找到则返回 null。 public virtual async Task GetByConditionAsync(Expression> expression) { Stopwatch 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) { Stopwatch 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(); } }