using Mapster;
using Microsoft.Extensions.Logging;
using QYZH.InteractiveMagazine.Infrastructure.Context;
using QYZH.InteractiveMagazine.Models.Dto;
using SqlSugar;
using SqlSugar.IOC;
using System.Data;
using System.Linq.Expressions;
namespace QYZH.InteractiveMagazine.Repository
{
///
/// 数据仓库类
///
///
public class BaseRepository : SimpleClient where T : class, new()
{
private readonly ILogger> _logger;
public BaseRepository(ISqlSugarClient context = null) : base(context)
{
Context = DbScoped.SugarScope;
_logger = ServiceContext.GetService>>();
}
#region add
public IInsertable Insertable(T t)
{
return Context.Insertable(t);
}
#endregion add
#region update
public IUpdateable Updateable(T t)
{
return Context.Updateable(t);
}
public IUpdateable Updateable()
{
return Context.Updateable();
}
public IUpdateable Updateable() where T1 : class, new()
{
return Context.Updateable();
}
///
/// 根据指定条件更新指定列 eg:Update(new SysUser(){ Status = 1 }, it => new { it.Status }, f => f.Userid == 1));
/// 只更新Status列,条件是包含
///
/// 实体类
/// 要更新列的表达式
/// where表达式
///
public async Task UpdateAsync(Expression> columns, Expression> where)
{
return await Context.Updateable().SetColumns(columns).Where(where).ExecuteCommandAsync() > 0;
}
#endregion update
///
/// 事务 异步 无返回值
///
///
///
public async Task UseTranAsync(Func action)
{
Context.Ado.BeginTran();//using不能少
try
{
await action();
Context.Ado.CommitTran();
}
catch (Exception ex)
{
Context.Ado.RollbackTran();
_logger.LogError($"UseTran 异常:{ex.StackTrace},{ex.Message}");
throw;
}
}
///
/// 事务 异步 返回bool
///
///
///
public async Task UseTranAsync(Func> action)
{
Context.Ado.BeginTran();//using不能少
try
{
var result = await action();
if (result)
{
Context.Ado.CommitTran();
return true;
}
else
{
Context.Ado.RollbackTran();
return false;
}
}
catch (Exception ex)
{
Context.Ado.RollbackTran();
_logger.LogError($"UseTran 异常:{ex.StackTrace},{ex.Message}");
throw;
}
}
#region delete
public IDeleteable Deleteable()
{
return Context.Deleteable();
}
#endregion delete
#region query
public bool Any(Expression> expression)
{
return Context.Queryable().Any(expression);
}
public ISugarQueryable Queryable()
{
return Context.Queryable();
}
public ISugarQueryable Queryable()
{
return Context.Queryable();
}
///
/// 根据条件表达式查询单条数据
///
/// 表达式
/// 泛型实体
public Task GetByIdAsync(Expression> expression) where R : class
{
return Context.Queryable().Where(expression).Select().FirstAsync();
}
public Task GetByExpressionAsync(Expression> expression) where R : class
{
return Context.Queryable().Where(expression).Select().FirstAsync();
}
public Task> GetListByExpression(Expression> expression) where T2 : class
{
return Context.Queryable().Where(expression).Select().ToListAsync();
}
///
/// 根据条件查询分页数据
///
///
///
///
public PageListModel GetPages(Expression> where, PageQueryModel parm)
{
var source = Context.Queryable().Where(where);
return source.ToPage(parm);
}
///
/// 分页获取数据
///
/// 条件表达式
///
///
///
///
public PageListModel GetPages(Expression> where, PageQueryModel parm, Expression> order, OrderByType orderEnum = OrderByType.Asc)
{
var source = Context
.Queryable()
.Where(where)
.OrderByIF(orderEnum == OrderByType.Asc, order, OrderByType.Asc)
.OrderByIF(orderEnum == OrderByType.Desc, order, OrderByType.Desc);
return source.ToPage(parm);
}
public PageListModel GetPages(Expression> where, PageQueryModel parm, Expression> order, string orderByType)
{
return GetPages(where, parm, order, orderByType == "desc" ? OrderByType.Desc : OrderByType.Asc);
}
///
/// 查询所有数据(无分页,请慎用)
///
///
public List GetAll(bool useCache = false, int cacheSecond = 3600)
{
return Context.Queryable().WithCacheIF(useCache, cacheSecond).ToList();
}
#endregion query
///
/// 此方法不带output返回值
/// var list = new List();
/// list.Add(new SugarParameter(ParaName, ParaValue)); input
///
///
///
///
public DataTable UseStoredProcedureToDataTable(string procedureName, List parameters)
{
return Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters);
}
///
/// 带output返回值
/// var list = new List();
/// list.Add(new SugarParameter(ParaName, ParaValue, true)); output
/// list.Add(new SugarParameter(ParaName, ParaValue)); input
///
///
///
///
public (DataTable, List) UseStoredProcedureToTuple(string procedureName, List parameters)
{
var result = (Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters), parameters);
return result;
}
}
///
/// 分页查询扩展
///
public static class QueryableExtension
{
///
/// 读取列表
///
///
/// 查询表单式
/// 分页参数
///
public static PageListModel ToPage(this ISugarQueryable source, PageQueryModel parm)
{
var page = new PageListModel();
var total = 0;
page.PageSize = parm.PageSize;
page.PageIndex = parm.PageIndex;
if (string.IsNullOrEmpty(parm.Sort))
{
source.OrderByPropertyName(parm.Sort, parm.SortType.Contains("desc") ? OrderByType.Desc : OrderByType.Asc);
}
page.Result = source
//.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.Contains("desc") ? "desc" : "asc")}")
.ToPageList(parm.PageIndex, parm.PageSize, ref total);
page.TotalNum = total;
return page;
}
///
/// 转指定实体类Dto
///
///
///
///
///
///
public static PageListModel ToPage(this ISugarQueryable source, PageQueryModel parm)
{
var page = new PageListModel();
var total = 0;
page.PageSize = parm.PageSize;
page.PageIndex = parm.PageIndex;
if (string.IsNullOrEmpty(parm.Sort))
{
source.OrderByPropertyName(parm.Sort, parm.SortType.Contains("desc") ? OrderByType.Desc : OrderByType.Asc);
}
var result = source
//.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.Contains("desc") ? "desc" : "asc")}")
.ToPageList(parm.PageIndex, parm.PageSize, ref total);
page.TotalNum = total;
page.Result = result.Adapt>();
return page;
}
}
}