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