分页数据
Repository下的分页
在Repository
层提供了PagedList
的结构来存储分页信息。
可以在Freesql的表达式后通过ToPagedList
或ToPagedListAsync
来快速分页。
需要注意的是,如果要获取固定顺序的列表,建议加上OrderBy
。这两个方法均可以快速获取PagedList。
PagedList<View_IpVisitEntity> = _db.Queryable<View_IpVisitEntity>().
.WhereIf(query.VisitStatusCode != null, it => it.VisitStatusCode.Equals(query.VisitStatusCode))
.OrderBy(x => x.IdentityNo)
.ToPagedListAsync(query.PageIndex, query.PageSize);
PagedList是一种不可变的结构体类型,常规情况下建议只作为返回值使用,尽量不要将其作为其他方法的入参。
同时,该分页还支持多表Join使用,最多支持到8个表。
对应的w可以支持w.t1,w.t2
以此类推到t8,就是按顺序对应的具体表,比如在下方的例子中,w.t1
就是BasicCodeEntity
,w.t2
就是BasicCodeCategoryEntity
var basicCodeList = await _db.Select<BasicCodeEntity, BasicCodeCategoryEntity>()
.InnerJoin((x, y) => y.InternalCode.Equals(x.Category) && !y.IsDeleted)
.WhereIf(!string.IsNullOrEmpty(request.Keyword), (x, y) => y.Keywords.Contains(request.Keyword))
.WhereIf(!string.IsNullOrWhiteSpace(request.CategoryCode),
(x, y) => x.Category.Equals(request.CategoryCode))
.Where((x, y) => x.IsDeleted == false)
.OrderBy((x, y) => x.DisplayOrder)
.ToPagedListAsync(w => new BasicMappingData(){ CategoryCode = w.t1.CategoryCode,Keyword = y.Keyword,... }, request.PageIndex, request.PageSize);
也可以利用自动匹配字段机制来完成
public async Task<PagedList<DeviceManagerMappingData>> GetDeviceManagerListByPage(DeviceManagerQuery query)
{
var list = await Db.Select<DeviceManagerEntity, HospitalMainEntity>().WithLock(SqlServerLock.NoLock)
.LeftJoin((a, b) => a.HospitalCode.Equals(b.HospitalCode))
.WhereIf(!string.IsNullOrWhiteSpace(query.Keyword), (a, b) => a.DeviceName.Contains(query.Keyword)
|| a.IpAddress.Contains(query.Keyword) || a.CreateUserCode.Contains(query.Keyword))
.WhereIf(!string.IsNullOrWhiteSpace(query.HospitalCode), (a, b) => a.HospitalCode.Contains(query.HospitalCode))
.OrderByPropertyName(query.Sort, query.IsAscending)
.ToPagedListAsync(w => new DeviceManagerMappingData(),query.PageIndex, query.PageSize);
return list;
}
Services下的分页和快速转换
出于层次隔离的考虑,PagedList
并不能直接用在Services层下。而Services提供了PagedResult
结果作为这一层的分页返回结构。
DtoPaged<T>.Convert
可以将传进来的list直接转换为PagedResult
。通过泛型Type传入Dto类,Convert会将实体Adpter
到Dto类
。
如果不需要Mapping则使用DtoPaged<GetRyIpVisitListDto>.Convert(list,false);
var list = _ipVisitRepository.GetRyIpVisitList(filter);
return DtoPaged<GetRyIpVisitListDto>.Convert(list);