/*********************************************************** **项目名称: **功能描述: 仓储 的摘要说明 **作 者: 易栋梁 **版 本 号: 1.0 **创建日期: 2015/12/7 16:06:56 **修改历史: ************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using SqlSugar; using Microsoft.AspNetCore.Http; using System.Security.Claims; using System.Text; using NPlatform.Infrastructure.IdGenerators; using NPlatform.Filters; using System.DirectoryServices; using DevExtreme.AspNet.Data; namespace BZPT.Repositories { /// /// 聚合仓储基类 /// /// 实体类型 /// 主键类型 public abstract class RepositoryBase : ResultHelper, IRepository, IRepositorySugarBase where TEntity : EntityBase, new() { [Autowired] public ILogger> loggerSvc { get; set; } [Autowired] public IHttpContextAccessor httpContextAccessor { get; set; } protected IRepositoryOptions Options; /// /// 数据库连接承载对象,默认注入基础库,管理所有的租户连接。 /// protected DBContext ContextManage; // 构造函数 public RepositoryBase(DBContext dbContext) { ContextManage = dbContext ?? throw new ArgumentNullException(nameof(dbContext)); } public string? GetUserId() { return httpContextAccessor.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; } public string? GetUserName() { return httpContextAccessor.HttpContext?.User?.Identity?.Name; } public ISqlSugarClient DbDefault { get { return ContextManage; } } /// /// 获取业务库对象 /// public ISqlSugarClient Db { get { var tenantId = httpContextAccessor.HttpContext?.User?.Claims?.Where(t => t.Type.ToUpper() =="TENANTID").FirstOrDefault()?.Value; var connection = ContextManage.GetConnection("default"); if (!string.IsNullOrWhiteSpace(tenantId)) { var tenant = ContextManage.GetConnection("default").Queryable().Where(t => t.Id == tenantId).First(); var configId = tenantId;//集团ID(也可以叫租户ID) if (!ContextManage.IsAnyConnection(configId)) { //用非默认ConfigId进行测试 //添加业务库只在当前上下文有效(原理:SqlSugarScope模式入门文档去看) ContextManage.AddConnection(new ConnectionConfig() { ConfigId = configId, ConnectionString = tenant.ConnectionString, DbType = Enum.Parse(tenant.DbType, true), IsAutoCloseConnection = true }); } //原理说明 //IsAnyConnection、AddConnection和GetConnection 都是Scope周期不同请求不会有影响 connection = ContextManage.GetConnection(configId); //可以给业务库result设置AOP和过滤滤器 } // connection.QueryFilter.AddTableFilter(it => it.IsDeleted == false); //// 应用过滤器 //foreach (var ft in this.Options.QueryFilters) //{ // var exp = ft.Value.GetFilter(); // if (exp != null) // { // connection.QueryFilter.AddTableFilter(exp); // } //} return connection; } } public TEntity this[string key] { get { if (EqualityComparer.Default.Equals(key, default(string))) { return default(TEntity); } return this.Db.Queryable().Where(t => t.Id != null && t.Id.Equals(key)).First(); } set { if (value is null) { throw new ArgumentNullException(nameof(value)); } //功能写法可以将插入和更新拆开,然后调用插入和更新独有特性 var x = Db.Storageable(value).ToStorage(); var rst = x.AsInsertable.ExecuteCommand();//不存在插入 var rst2 = x.AsUpdateable.ExecuteCommand();//存在更新 } } /// /// Initializes a new instance of the class. /// 仓储基类 /// /// /// 仓储配置 /// public RepositoryBase(IRepositoryOptions option, DBContext dbContext) { Options = option; ContextManage = dbContext; } #region 新增、修改、删除 /// /// 异步新增 /// /// 新增对象的集合 /// A representing the asynchronous operation. public async virtual Task AddsAsync(params TEntity[] items) { if (items is null) { throw new ArgumentNullException(nameof(items)); } foreach(var item in items) { if(string.IsNullOrWhiteSpace(item.Id)) item.Id= StringObjectIdGenerator.Instance.GenerateId().ToString(); } return await this.Db.Insertable(items).ExecuteCommandAsync(); } /// /// 异步新增 /// /// 新增对象的集合 /// A representing the asynchronous operation. public async virtual Task AddOrUpdate(TEntity item) { if (item is null) { throw new ArgumentNullException(nameof(item)); } Db.Ado.CommandTimeOut = 30; // 设置30秒超时 //功能写法可以将插入和更新拆开,然后调用插入和更新独有特性 var x = Db.Storageable(item).ToStorage(); var rst = await x.AsInsertable.ExecuteCommandAsync();//不存在插入 var rst2 = await x.AsUpdateable.ExecuteCommandAsync();//存在更新 return rst + rst2; } public virtual async Task RemoveAsync(Expression> filter) { if (filter == null) return -1; if (typeof(TEntity).IsAssignableFrom(typeof(ILogicDelete))) { var rst = this.Db.Updateable() .SetColumns(t => ((ILogicDelete)t).IsDeleted == true) .Where(filter); return await rst.ExecuteCommandAsync(); } else return await Db.Deleteable().Where(filter).ExecuteCommandAsync(); } public virtual async Task RemoveAsync(params string[] keys) { if (keys == null) { throw new ArgumentNullException(nameof(keys)); } return await this.RemoveAsync(t => keys.Contains(t.Id)); } public async Task UpdateAsync(TEntity item) { return await Db.Updateable(item).ExecuteCommandAsync(); } public async Task UpdateAsync(Expression> columns, Expression> where) { return await Db.Updateable() .SetColumns(columns)//类只能在表达示里面不能提取 .Where(where) .ExecuteCommandAsync(); } public async Task UpdatesAsync(List entities, Expression> columns) { return await Db.Updateable(entities) .UpdateColumns(columns) .ExecuteCommandAsync(); } #endregion #region 查询 public async virtual Task ExistsAsync(string key) { if (EqualityComparer.Default.Equals(key, default(string))) { return false; } return await this.Db.Queryable().AnyAsync(t => t.Id != null && t.Id.Equals(key)); } public async virtual Task ExistsAsync(Expression> filter) { if (filter == null) { return false; } //// 应用过滤器 //foreach (var ft in this.Options.QueryFilters) //{ // var exp = ft.Value.GetFilter(); // if (exp != null) // { // filter = filter.AndAlso(exp); // } //} return await this.Db.Queryable().AnyAsync(filter); } public async Task> GetAllAsync(IEnumerable> sorts = null) { try { // 获取可查询对象 var query = ContextManage.Queryable(); // 如果有排序条件,则应用排序 if (sorts != null && sorts.Any()) { query = query.OrderBy(sorts); } Type type = typeof(TEntity); // 如果实现了ILogicDelete接口且filter不包含IsDeleted条件,则添加IsDeleted=false条件 if (typeof(ILogicDelete).IsAssignableFrom(type)) { query = query.Where(t => ((ILogicDelete)t).IsDeleted == false); } // 返回查询结果 return await query.ToListAsync(); } catch (Exception ex) { throw new Exception("无法从数据库中检索数据.", ex); } } public async virtual Task FindByAsync(string key) { if (EqualityComparer.Default.Equals(key, default(string))) { return default(TEntity); } return await this.Db.Queryable().Where(t => t.Id != null && t.Id.Equals(key)).FirstAsync(); } public async virtual Task GetFirstOrDefaultAsync(Expression> filter) { if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().Where(filter).FirstAsync(); } public async virtual Task> GetListByExpAsync(Expression> filter, IEnumerable> sorts = null) { if (filter is null) { throw new ArgumentNullException(nameof(filter)); } Type type = typeof(TEntity); // 如果实现了ILogicDelete接口且filter不包含IsDeleted条件,则添加IsDeleted=false条件 if (typeof(ILogicDelete).IsAssignableFrom(type)) { if (!filter.ToString().Contains("IsDeleted")) { // 动态构建 t.IsDeleted == false 条件 filter = filter.AndAlso(t => ((ILogicDelete)t).IsDeleted == false); } } var setAll = this.Db.Queryable().Where(filter); if (sorts != null) setAll = setAll.OrderBy(sorts); return await setAll.ToListAsync(); } /// /// EF 版本,EF实现指定字段查询比较困难,所以先查出所有字段 /// /// /// /// /// public async virtual Task> GetListWithColumnsAsync(IEnumerable columnNames, Expression> filter, IEnumerable> sorts = null) { if (filter is null) { throw new ArgumentNullException(nameof(filter)); } Type type = typeof(TEntity); // 如果实现了ILogicDelete接口且filter不包含IsDeleted条件,则添加IsDeleted=false条件 if (typeof(ILogicDelete).IsAssignableFrom(type)) { if (!filter.ToString().Contains("IsDeleted")) { // 动态构建 t.IsDeleted == false 条件 filter = filter.AndAlso(t => ((ILogicDelete)t).IsDeleted == false); } } var rst = await GetListByExpAsync(filter, sorts); return rst; } public async virtual Task> GetPagedAsync(int pageIndex, int pageSize, Expression> filter, IEnumerable> sorts) { if (filter is null) { throw new ArgumentNullException(nameof(filter)); } RefAsync total = 0; Type type = typeof(TEntity); // 如果实现了ILogicDelete接口且filter不包含IsDeleted条件,则添加IsDeleted=false条件 if (typeof(ILogicDelete).IsAssignableFrom(type)) { if (!filter.ToString().Contains("IsDeleted")) { // 动态构建 t.IsDeleted == false 条件 filter = filter.AndAlso(t => ((ILogicDelete)t).IsDeleted == false); } } var resultSet = this.Db.Queryable().Where(filter); if (sorts != null) resultSet = resultSet.OrderBy(sorts); var pageData = await resultSet.ToPageListAsync(pageIndex, pageSize, total); return base.ListData(pageData, total); } public async virtual Task> GetPagedAsync(DataSourceLoadOptions loadOptions) { var query = this.Db.Queryable(); var datas=await query.LoadAsync(loadOptions); return datas; } #endregion #region 统计 public async Task CountAsync(Expression> filter) { if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().CountAsync(filter); } public async Task MaxAsync(Expression> selector, Expression> filter = null) { if (selector is null) { throw new ArgumentNullException(nameof(selector)); } if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().Where(filter).MaxAsync(selector); } public async Task MinAsync(Expression> selector, Expression> filter = null) { if (selector is null) { throw new ArgumentNullException(nameof(selector)); } if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().Where(filter).MinAsync(selector); } public async Task SumAsync(Expression> selector, Expression> filter = null) { if (selector is null) { throw new ArgumentNullException(nameof(selector)); } if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().Where(filter).SumAsync(selector); } public async Task AVGAsync(Expression> selector, Expression> filter = null) { if (selector is null) { throw new ArgumentNullException(nameof(selector)); } if (filter is null) { throw new ArgumentNullException(nameof(filter)); } return await this.Db.Queryable().Where(filter).AvgAsync(selector); } public Task SaveChangesAsync() { throw new NotImplementedException("sqlsugar 不支持"); } #endregion } }