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