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 语义,保持接口兼容
}