using System.Linq.Expressions; using FreeSql; using F9WebAiTest.Domain.Common; namespace F9WebAiTest.Infrastructure.Repositories; /// 通用仓储实现(基于 FreeSql) public class Repository : IRepository where T : class, IEntity { protected readonly IFreeSql _fsql; public Repository(IFreeSql fsql) { _fsql = fsql; } public virtual async Task GetByIdAsync(long id) => await _fsql.Select().Where(e => e.Id == id).FirstAsync(); public virtual async Task> GetAllAsync() => await _fsql.Select().ToListAsync(); public virtual async Task> FindAsync(Expression> predicate) => await _fsql.Select().Where(predicate).ToListAsync(); public virtual async Task FirstOrDefaultAsync(Expression> predicate) => await _fsql.Select().Where(predicate).FirstAsync(); public virtual async Task AnyAsync(Expression> predicate) => await _fsql.Select().Where(predicate).AnyAsync(); public virtual async Task CountAsync(Expression> predicate) => await _fsql.Select().Where(predicate).CountAsync(); public virtual async Task AddAsync(T entity) { entity.CreatedAt = DateTime.Now; await _fsql.Insert(entity).ExecuteAffrowsAsync(); // FreeSql 在 SQLite 下不回填自增主键,手动用 last_insert_rowid 获取并回填 if (entity.Id == 0) { entity.Id = Convert.ToInt64(await _fsql.Ado.ExecuteScalarAsync("SELECT last_insert_rowid();")); } return entity; } public virtual async Task AddRangeAsync(IEnumerable entities) { foreach (var e in entities) e.CreatedAt = DateTime.Now; await _fsql.Insert(entities).ExecuteAffrowsAsync(); } public virtual async Task UpdateAsync(T entity) { entity.UpdatedAt = DateTime.Now; await _fsql.Update().SetSource(entity).ExecuteAffrowsAsync(); } public virtual async Task DeleteAsync(T entity) { entity.IsDeleted = true; entity.UpdatedAt = DateTime.Now; await _fsql.Update().SetSource(entity).ExecuteAffrowsAsync(); } public virtual async Task DeleteRangeAsync(IEnumerable entities) { foreach (var e in entities) { e.IsDeleted = true; e.UpdatedAt = DateTime.Now; } await _fsql.Update().SetSource(entities).ExecuteAffrowsAsync(); } public virtual async Task HardDeleteAsync(T entity) => await _fsql.Delete().Where(e => e.Id == entity.Id).ExecuteAffrowsAsync(); public virtual async Task HardDeleteRangeAsync(IEnumerable entities) { var ids = entities.Select(e => e.Id).ToList(); if (ids.Count > 0) await _fsql.Delete().Where(e => ids.Contains(e.Id)).ExecuteAffrowsAsync(); } public virtual Task SaveChangesAsync() => Task.FromResult(1); // FreeSql 即时提交,无 SaveChanges 语义,保持接口兼容 }