using EFSecondLevelCache.Core; using Masuit.LuceneEFCore.SearchEngine.Interfaces; using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface; using Masuit.MyBlogs.Core.Infrastructure.Services.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace Masuit.MyBlogs.Core.Infrastructure.Services { /// /// 业务层基类 /// /// public class BaseService : IBaseService where T : class, new() { public virtual IBaseRepository BaseDal { get; set; } protected readonly ISearchEngine _searchEngine; protected readonly ILuceneIndexSearcher _searcher; public BaseService(IBaseRepository repository, ISearchEngine searchEngine, ILuceneIndexSearcher searcher) { BaseDal = repository; _searchEngine = searchEngine; _searcher = searcher; } /// /// 获取所有实体 /// /// 还未执行的SQL语句 public virtual IQueryable GetAll() { return BaseDal.GetAll(); } /// /// 获取所有实体(不跟踪) /// /// 还未执行的SQL语句 public virtual IQueryable GetAllNoTracking() { return BaseDal.GetAllNoTracking(); } /// /// 从二级缓存获取所有实体 /// /// 还未执行的SQL语句 public virtual EFCachedDbSet GetAllFromCache() { return BaseDal.GetAllFromCache(); } /// /// 获取所有实体 /// /// 映射实体 /// 还未执行的SQL语句 public virtual IQueryable GetAll() where TDto : class { return BaseDal.GetAll(); } /// /// 获取所有实体 /// /// 映射实体 /// 还未执行的SQL语句 public virtual IEnumerable GetAllFromCache() where TDto : class { return BaseDal.GetAllFromCache(); } /// /// 获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetAll(Expression> @orderby, bool isAsc = true) { return BaseDal.GetAll(orderby, isAsc); } /// /// 获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetAllNoTracking(Expression> @orderby, bool isAsc = true) { return BaseDal.GetAllNoTracking(orderby, isAsc); } /// /// 获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IEnumerable GetAllFromCache(Expression> @orderby, bool isAsc = true) { return BaseDal.GetAllFromCache(orderby, isAsc); } /// /// 获取所有实体 /// /// 排序 /// 映射实体 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IQueryable GetAll(Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.GetAll(orderby, isAsc); } /// /// 获取所有实体 /// /// 排序 /// 映射实体 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IEnumerable GetAllFromCache(Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.GetAllFromCache(orderby, isAsc); } /// /// 基本查询方法,获取一个集合 /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQuery(Expression> @where) { return BaseDal.GetQuery(where); } /// /// 基本查询方法,获取一个集合 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 IOrderedQueryable IBaseService.GetQuery(Expression> @where, Expression> @orderby, bool isAsc) { return BaseDal.GetQuery(where, orderby, isAsc); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合 /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQuery(Expression> @where) where TDto : class { return BaseDal.GetQuery(where); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合 /// /// 排序字段 /// 输出类型 /// 查询条件 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 /// public virtual IQueryable GetQuery(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.GetQuery(where, orderby, isAsc); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 查询条件 /// 还未执行的SQL语句 public virtual IEnumerable GetQueryFromCache(Expression> @where) { return BaseDal.GetQueryFromCache(where); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 排序字段 /// 查询条件 /// 排序方式 /// 是否升序 /// 还未执行的SQL语句 public virtual IEnumerable GetQueryFromCache(Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetQueryFromCache(where, orderby, isAsc); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取 /// /// 查询条件 /// 还未执行的SQL语句 public virtual IEnumerable GetQueryFromCache(Expression> @where) where TDto : class { return BaseDal.GetQueryFromCache(where); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取 /// /// 排序字段 /// 输出类型 /// 查询条件 /// 排序方式 /// 是否升序 /// 还未执行的SQL语句 public virtual IEnumerable GetQueryFromCache(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.GetQueryFromCache(where, orderby, isAsc); } /// /// 基本查询方法,获取一个集合(不跟踪实体) /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQueryNoTracking(Expression> @where) { return BaseDal.GetQueryNoTracking(where); } /// /// 基本查询方法,获取一个集合(不跟踪实体) /// /// 排序字段 /// 查询条件 /// 排序方式 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetQueryNoTracking(Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetQueryNoTracking(where, orderby, isAsc); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public virtual T Get(Expression> @where) { return BaseDal.Get(where); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public T GetFromCache(Expression> @where) { return BaseDal.GetFromCache(where); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual T Get(Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.Get(where, orderby, isAsc); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public T GetFromCache(Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetFromCache(where, orderby, isAsc); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 查询条件 /// 实体 public virtual TDto Get(Expression> @where) where TDto : class { return BaseDal.Get(where); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 查询条件 /// 实体 public TDto GetFromCache(Expression> @where) where TDto : class { return BaseDal.GetFromCache(where); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 排序 /// 映射实体 /// 查询条件 /// 排序字段 /// 是否升序 /// 映射实体 public virtual TDto Get(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.Get(where, orderby, isAsc); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 排序 /// 映射实体 /// 查询条件 /// 排序字段 /// 是否升序 /// 映射实体 public TDto GetFromCache(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return BaseDal.GetFromCache(where, orderby, isAsc); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual async Task GetAsync(Expression> @where, Expression> @orderby, bool isAsc = true) { return await BaseDal.GetAsync(where, orderby, isAsc); } /// /// 获取第一条数据,优先从缓存读取 /// /// 查询条件 /// 实体 public virtual async Task GetAsync(Expression> @where) { return await BaseDal.GetAsync(where); } /// /// 获取第一条数据(不跟踪实体) /// /// 查询条件 /// 实体 public virtual T GetNoTracking(Expression> @where) { return BaseDal.GetNoTracking(where); } /// /// 获取第一条数据(不跟踪实体) /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual T GetNoTracking(Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetNoTracking(where, orderby, isAsc); } /// /// 获取第一条数据(异步,不跟踪实体) /// /// 查询条件 /// 实体 public virtual async Task GetNoTrackingAsync(Expression> @where) { return await BaseDal.GetNoTrackingAsync(where); } /// /// 获取第一条数据(异步,不跟踪实体) /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual async Task GetNoTrackingAsync(Expression> @where, Expression> @orderby, bool isAsc = true) { return await BaseDal.GetNoTrackingAsync(where, orderby, isAsc); } /// /// 根据ID找实体 /// /// 实体id /// 实体 public virtual T GetById(object id) { return BaseDal.GetById(id); } /// /// 根据ID找实体(异步) /// /// 实体id /// 实体 public virtual async Task GetByIdAsync(object id) { return await BaseDal.GetByIdAsync(id); } /// /// 高效分页查询方法 /// /// /// 第几页 /// 每页大小 /// 数据总数 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// 还未执行的SQL语句 public virtual IQueryable GetPages(int pageIndex, int pageSize, out int totalCount, Expression> where, Expression> orderby, bool isAsc = true) { return BaseDal.GetPages(pageIndex, pageSize, out totalCount, where, orderby, isAsc); } /// /// 高效分页查询方法,取出被AutoMapper映射后的数据集合 /// /// 排序字段 /// 映射实体 /// 第几页 /// 每页大小 /// 数据总数 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// 还未执行的SQL语句 public virtual IQueryable GetPages(int pageIndex, int pageSize, out int totalCount, Expression> @where, Expression> @orderby, bool isAsc) where TDto : class { return BaseDal.GetPages(pageIndex, pageSize, out totalCount, where, orderby, isAsc); } /// /// 高效分页查询方法,优先从二级缓存读取 /// /// 排序字段 /// 第几页 /// 每页大小 /// 数据总数 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// 还未执行的SQL语句 public virtual EFCachedQueryable GetPagesFromCache(int pageIndex, int pageSize, out int totalCount, Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetPagesFromCache(pageIndex, pageSize, out totalCount, where, orderby, isAsc); } /// /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合 /// /// 排序字段 /// 映射实体 /// 第几页 /// 每页大小 /// 数据总数 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// 还未执行的SQL语句 public virtual EFCachedQueryable GetPagesFromCache(int pageIndex, int pageSize, out int totalCount, Expression> @where, Expression> @orderby, bool isAsc) where TDto : class { return BaseDal.GetPagesFromCache(pageIndex, pageSize, out totalCount, where, orderby, isAsc); } /// /// 高效分页查询方法(不跟踪实体) /// /// 排序字段 /// 第几页 /// 每页大小 /// 数据总数 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// 还未执行的SQL语句 public virtual IQueryable GetPagesNoTracking(int pageIndex, int pageSize, out int totalCount, Expression> @where, Expression> @orderby, bool isAsc = true) { return BaseDal.GetPagesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc); } /// /// 根据ID删除实体 /// /// 实体id /// 删除成功 public virtual bool DeleteById(object id) { return BaseDal.DeleteById(id); } /// /// 根据ID删除实体并保存 /// /// 实体id /// 删除成功 public virtual bool DeleteByIdSaved(object id) { BaseDal.DeleteById(id); return SaveChanges() > 0; } /// /// 根据ID删除实体并保存(异步) /// /// 实体id /// 删除成功 public virtual async Task DeleteByIdSavedAsync(object id) { BaseDal.DeleteById(id); return await SaveChangesAsync(); } /// /// 删除实体并保存 /// /// 需要删除的实体 /// 删除成功 public virtual bool DeleteEntity(T t) { return BaseDal.DeleteEntity(t); } /// /// 根据条件删除实体 /// /// 查询条件 /// 删除成功 public virtual int DeleteEntity(Expression> @where) { return BaseDal.DeleteEntity(where); } /// /// 根据条件删除实体 /// /// 查询条件 /// 删除成功 public virtual int DeleteEntitySaved(Expression> @where) { BaseDal.DeleteEntity(where); return SaveChanges(); } /// /// 根据条件删除实体 /// /// 查询条件 /// 删除成功 public virtual async Task DeleteEntitySavedAsync(Expression> @where) { BaseDal.DeleteEntity(where); return await SaveChangesAsync(); } /// /// 根据条件删除实体(异步) /// /// 查询条件 /// 删除成功 public virtual async Task DeleteEntityAsync(Expression> @where) { return await BaseDal.DeleteEntityAsync(where); } /// /// 删除实体并保存 /// /// 需要删除的实体 /// 删除成功 public virtual bool DeleteEntitySaved(T t) { BaseDal.DeleteEntity(t); return SaveChanges() > 0; } /// /// 删除实体并保存(异步) /// /// 需要删除的实体 /// 删除成功 public virtual async Task DeleteEntitySavedAsync(T t) { BaseDal.DeleteEntity(t); return await SaveChangesAsync(); } /// /// 添加实体 /// /// 需要添加的实体 /// 添加成功 public virtual T AddEntity(T t) { return BaseDal.AddEntity(t); } /// /// 添加实体并保存 /// /// 需要添加的实体 /// 添加成功 public virtual T AddEntitySaved(T t) { T entity = BaseDal.AddEntity(t); bool b = SaveChanges() > 0; return b ? entity : null; } /// /// 添加实体并保存(异步) /// /// 需要添加的实体 /// 添加成功 public virtual async Task AddEntitySavedAsync(T t) { BaseDal.AddEntity(t); return await SaveChangesAsync(); } /// /// 统一保存的方法 /// /// 受影响的行数 public virtual int SaveChanges() { return BaseDal.SaveChanges(); } /// /// 统一保存数据 /// /// 受影响的行数 public virtual async Task SaveChangesAsync() { return await BaseDal.SaveChangesAsync(); } /// /// 判断实体是否在数据库中存在 /// /// 查询条件 /// 是否存在 public virtual bool Any(Expression> @where) { return BaseDal.Any(where); } /// /// 统计符合条件的个数 /// /// 查询条件 /// public int Count(Expression> @where) { return BaseDal.Count(where); } /// /// 删除多个实体 /// /// 实体集合 /// 删除成功 public virtual bool DeleteEntities(IEnumerable list) { return BaseDal.DeleteEntities(list); } /// /// 删除多个实体并保存 /// /// 实体集合 /// 删除成功 public virtual bool DeleteEntitiesSaved(IEnumerable list) { BaseDal.DeleteEntities(list); return SaveChanges() > 0; } /// /// 删除多个实体并保存(异步) /// /// 实体集合 /// 删除成功 public virtual async Task DeleteEntitiesSavedAsync(IEnumerable list) { BaseDal.DeleteEntities(list); return await SaveChangesAsync(); } /// /// 添加多个实体并保存 /// /// 实体集合 /// 添加成功 public virtual IEnumerable AddEntities(IList list) { IEnumerable entities = BaseDal.AddEntities(list); SaveChanges(); return entities; } /// /// 添加多个实体并保存(异步) /// /// 实体集合 /// 添加成功 public virtual async Task> AddEntitiesAsync(IList list) { IEnumerable entities = BaseDal.AddEntities(list); await SaveChangesAsync(); return entities; } /// /// 批量添加实体 /// /// 需要添加的实体 public virtual void BulkInsert(IEnumerable list) { BaseDal.BulkInsert(list); } /// /// 统一批量保存数据 /// public virtual void BulkSaveChanges() { BaseDal.BulkSaveChanges(); } } }