# 查询服务基类

具体代码可查看LessSharp.ServiceBase目录下的QueryServer类。

这是一个仅提供查询功能的基类,一般是用于实现了IQuery接口的视图对象,有两种泛型定义,如下所示

//用于无Id的对象
public abstract class QueryService<TDto, TQueryDto, TQuery>
        where TQuery : class
        where TQueryDto : QueryDto
{

}
//用于有Id的对象
 public abstract class QueryService<TDto, TQueryDto, TQuery, TId> :
    QueryService<TDto, TQueryDto, TQuery>
        where TQuery : class
        where TQueryDto : QueryDto
{

}
泛型类型 说明
TDto 显示传输对象
TQueryDto 查询参数传输对象
TQuery 查询对象,一般是实现了IQuery的类
TId TQuery对象Id字段的类型

例如

我要创建一个用户查询服务类UserService,用户实体为User(已实现IQuery接口),Id字段类型为int,显示DtoUserDto,查询参数DtoUserQueryDto,那类的定义如下所示:

 public class UserService : QueryService<UserDto, UserQueryDto, User, int>
{

}

# 属性

属性名 修饰 类型 说明
DbContext protected AppDbContext 这是EF的上下文类
Mapper protected IMapper AutoMapper的映射类
DbQuery protected IQueryable<TQuery> 查询对象类,此对象默认会经过查询过滤器处理
OrderDescDefaultValue protected bool 是否默认Desc排序,默认值为true
OrderDefaultField protected Expression<Func<TQuery, object>> 默认排序字段,当有Id字段时,默认值有e=>e.Id
QueryFilters protected List<IQueryFilter<TQuery>> 查询过滤器列表
QueryToDtoMapExpression protected Expression<Func<TQuery, TDto>> 对象映射表达式,赋值时会采用这个映射规则,不赋值会使用autoMapper进行自动映射
IdFieldExpression

第二种泛型类才有此属性
protected Expression<Func<TQuery, TId>> 查询实体Id值表达式

提示

如果需要修改属性的值 ,请在服务类的构造函数中进行修改。

# 方法

方法名 修饰 说明
BuildQuery<T> protected 构建查询对象,将传入的查询对象根据查询参数对象进行条件过滤、字段排序、分页、对象映射处理。
IQueryable<T> BuildQuery<T>(IQueryable<TQuery> query, TQueryDto queryDto, Expression<Func<TQuery, T>> selectExp = null)
QueryToListAsync<T> protected
async
转换成列表数据,将传入的查询对象根据查询参数进行条件过滤、字段排序、分页、对象映射处理并转换成列表数据
Task<List<T>> QueryToListAsync<T>(IQueryable<TQuery> query, TQueryDto queryDto, Expression<Func<TQuery, T>> selectExp = null)
Where protected 查询过滤方法
IQueryable<TQuery> Where(IQueryable<TQuery> query, TQueryDto queryDto)
QueryFilter protected 将传入的查询对象经查询过滤器处理
IQueryable<TQuery> QueryFilter(IQueryable<TQuery> query)
Select<T> protected 将查询对象映射为T类型的查询对象
IQueryable<T> Select<T>(IQueryable<TQuery> query)
Page<T> protected 列表分页方法
IQueryable<T> Page<T>(IQueryable<T> query, int pageIndex, int pageSize, bool isPageContinuity = false)
QueryToTotalAsync protected
async
转换成列表数量,将传入的查询对象根据查询参数进行条件过滤处理并统计列表数量
Task<int> QueryToTotalAsync(IQueryable<TQuery> query, TQueryDto queryDto)
QueryToPageListAsync protected
async
获取分页列表
Task<PageListDto<T>> QueryToPageListAsync<T>(IQueryable<TQuery> query, TQueryDto queryDto, Expression<Func<TQuery, T>> selectExp = null)
QueryToSingleAsync protected
async
获取单个记录
Task<T> QueryToSingleAsync<T>(IQueryable<TQuery> query,Expression<Func<TQuery, bool>> expression, Expression<Func<TQuery, T>> selectExp = null)
CheckExistAsync protected
async
检查对象是否存在
Task<bool> CheckExistAsync<T>(IQueryable<T> query, Expression<Func<T, bool>> expression)
GetExpressionByField<TObject,TField> protected 根据字段构建lambda表达式
Expression<Func<TObject, TField>> GetExpressionByField<TObject, TField>(string field)
GetListAsync public
virtual
async
获取列表数据
Task<List<TDto>> GetListAsync(TQueryDto queryDto)
GetListAsync<T> public
async
获取定列表数据,主要是给其它服务类使用
Task<List<T>> GetListAsync<T>(TQueryDto queryDto, Expression<Func<TQuery, T>> selectExp = null)
GetList public
virtual
async
获取列表数据
List<TDto> GetList(TQueryDto queryDto)
GetPageListAsync public
virtual
async
获取分页列表数据
Task<PageListDto<TDto>> GetPageListAsync(TQueryDto queryDto)
GetPageListAsync<T> public
async
获取分页列表数据,可自定义映射的对象类型
Task<PageListDto<T>> GetPageListAsync<T>(TQueryDto queryDto, Expression<Func<TQuery, T>> selectExp = null)
GetPageList public
virtual
获取分页列表数据
PageListDto<TDto> GetPageList(TQueryDto queryDto)
QueryToSingleByIdAsync<T>
第二种泛型类才有此方法
protected
async
根据传入的查询对象及Id值获取单个数据
Task<T> QueryToSingleByIdAsync<T>(IQueryable<TQuery> query, TId id, Expression<Func<TQuery, T>> selectExp = null)
GetByIdAsync public
virtual
async
根据Id获取单个对象
Task<TDto> GetByIdAsync(TId id)
GetById public
virtual
根据Id获取单个对象
TDto GetById(TId id)
GetByIdAsync<T> public
async
根据Id获取单个对象,可自定义映射的对象类型
Task<T> GetByIdAsync<T>(TId id, Expression<Func<TQuery, T>> selectExp = null)

# 事件

事件名 说明
OnFilter 查询过滤时处理方法
IQueryable<TQuery> OnFilter(IQueryable<TQuery> query, TQueryDto queryDto)
OnGetSortExpression 查询列表字段排序处理方法
Expression<Func<TQuery, object>> OnGetSortExpression(string field)
OnSort 查询列表字段排序处理方法,这个是针对一些特殊情况,例如要多字段排序之类的
IQueryable<TQuery> OnSort(IQueryable<TQuery> query, string field, bool orderDesc) => query;

提示

这里的事件不是真正的事件类型,而是一些带有virtual修饰的方法,通过重写此方法达到事件的效果。

上次更新: 1/3/2021, 9:01:12 PM