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;
}
}