namespace Repository; /// /// 仓储基础接口 /// /// 实体类型 public interface IBaseRepository where T : BaseEntity { /// /// 获取所有数据 /// Task> GetAllAsync(); /// /// 根据ID获取单条数据 /// Task GetByIdAsync(long id); /// /// 根据ID获取单条数据 /// Task GetByIdsAsync(long[] ids); /// /// 添加数据 /// Task AddAsync(T entity); /// /// 添加数据 /// Task AddRangeAsync(IEnumerable entities); /// /// 更新数据 /// Task UpdateAsync(T entity); /// /// 批量更新数据 /// Task UpdateRangeAsync(IEnumerable entities); /// /// 删除数据 /// Task DeleteAsync(long id); /// /// 执行动态SQL查询,返回动态对象 /// /// 完整的SELECT SQL语句 /// 动态查询结果列表 Task> ExecuteDynamicSqlAsync(string completeSql); } /// /// 仓储基类实现 - 基于 FreeSql /// /// 实体类型 public abstract class BaseRepository(IFreeSql freeSql) : IBaseRepository where T : BaseEntity { protected readonly IFreeSql FreeSql = freeSql ?? throw new ArgumentNullException(nameof(freeSql)); public virtual async Task> GetAllAsync() { try { return await FreeSql.Select().ToListAsync(); } catch { return []; } } public virtual async Task GetByIdAsync(long id) { try { // FreeSql 会根据配置自动识别主键 return await FreeSql.Select().Where(x => x.Id == id).FirstAsync(); } catch { return null; } } public virtual async Task GetByIdsAsync(long[] ids) { try { var result = await FreeSql.Select().Where(x => ids.Contains(x.Id)).ToListAsync(); return result.ToArray(); } catch { return []; } } public virtual async Task AddAsync(T entity) { try { var result = await FreeSql.Insert(entity).ExecuteAffrowsAsync(); return result == 1; } catch { return false; } } public async Task AddRangeAsync(IEnumerable entities) { var result = await FreeSql.Insert(entities).ExecuteAffrowsAsync(); return result == entities.Count(); } public virtual async Task UpdateAsync(T entity) { try { var affrows = await FreeSql.Update() .SetSource(entity) .ExecuteAffrowsAsync(); return affrows > 0; } catch (Exception ex) { Console.WriteLine($"Update failed: {ex.Message}"); return false; } } public virtual async Task UpdateRangeAsync(IEnumerable entities) { try { var affrows = await FreeSql.Update() .SetSource(entities) .ExecuteAffrowsAsync(); return affrows == entities.Count(); } catch (Exception ex) { Console.WriteLine($"UpdateRange failed: {ex.Message}"); return false; } } public virtual async Task DeleteAsync(long id) { try { var affrows = await FreeSql.Delete().Where(x => x.Id == id).ExecuteAffrowsAsync(); return affrows > 0; } catch { return false; } } public async Task> ExecuteDynamicSqlAsync(string completeSql) { var dt = await FreeSql.Ado.ExecuteDataTableAsync(completeSql); var result = new List(); foreach (DataRow row in dt.Rows) { var expando = new ExpandoObject() as IDictionary; foreach (DataColumn column in dt.Columns) { expando[column.ColumnName] = row[column]; } result.Add(expando); } return result; } }