P36 排序(上)


P36 排序(上)

排序分为哪几种情况。为集合类型的资源进行排序。排序通常是使用QueryString的这种形式。
P36 排序(上)
表示按照倒叙排序。字段后面加空格。如果没有desc技术默认按照正序进行排序。
P36 排序(上)
先按照companyName倒叙,再按照id正序排序。
P36 排序(上)
争对谁来进行排序。面向外部的,俺么就是EmployeeDto,对dto的属性进行排序。
P36 排序(上)

复杂的是dto里面name对应的是entity里面连个属性。这种情况如果要排序,肯定是要写一些代码来进行处理。
P36 排序(上)
再就是age对应的出生日期。也需要单独处理。如果age按照正序排列的话,那么DateOfBirth就要按照倒叙进行排列。
P36 排序(上)

写代码

这是提前写好的类。里面奶奶有一些分页的信息,还有一些可查询的字段等等。
P36 排序(上)
这里第二个参数和第三个参数统一放到了paramsters里面了
P36 排序(上)
下面这个方法的第二个和第三个参数也换成了paramsters
P36 排序(上)
repository层的参数的替换
P36 排序(上)
添加一个配需的属性。并给他赋一个默认值。如果没有传排序的属性,那么就按照默认值的字段进行排序。
P36 排序(上)
默认按Name字段来
P36 排序(上)
上面代码都是条件的过滤。这里写排序的逻辑。
P36 排序(上)
统一变成小写,先按照FirstName排序,再按照LastName进行排序。
P36 排序(上)
上面的代码,这块代码直接删除。
P36 排序(上)

然后把最后悔这里的orderBy去掉
P36 排序(上)

测试

先查询公司下的员工
P36 排序(上)
根据name排序
P36 排序(上)

让排序灵活并且复用

第一个问题:属性名Name是需要映射的。需要把dto里面需要排序的属性映射到entity里面。
第二名:把映射好的排序规则,应用到dbContext上面。确切的说是应用到IQueryable上。有扩展库System.linq.Dynamic.Core提供支持使用属性名的字符串形式,来按照属性进行排序。有了这个库之后,只要我们的orderBY对应dto上的属性名。那么我们就可以进行正常的排序了。
否则我们就需要进行一顿switch进行排序。
P36 排序(上)

复用性:不想针对每一个资源都写一大堆的排序的代码。个人考虑这里使用扩展方法,因为我们的查询表达式都是Iqueryabel类型的,。所以我想写一个针对IQueryabel类型的扩展方法。然后把这些映射关系以及排序都传进去之后来进行排序。这个扩展方法就可以到处复用了。
P36 排序(上)

写代码

先把这段代码去掉
P36 排序(上)
写上一行代码。ApplySort是一个排序的扩展方法。传入orderBy和 一个映射关系的Dictionary类型的


P36 排序(上)
先来讲一下映射的思路,借助dotnet.core的DI容器到处注入。
P36 排序(上)
要解决一个资源映射多个entity的属性的问题
P36 排序(上)
可能需要反转顺序。比如age映射 出生日期
P36 排序(上)
这个思路也是跟别人学的,也不是自己原创的。看起来也是挺麻烦的,
P36 排序(上)
需要接入dotnetCore的DI容器,PropertyMappingService实现IPropertyMappingService的接口
P36 排序(上)
IPropertyMapping也是一个接口。它里面有两个泛型类,TSource(相当于是dto)和TDestination(相当于是entity)
P36 排序(上)
PropertyMapping里面有个属性Dictionary,Dictionary也是集合存放的是
一个PropertyMapping相当于是一条记录,就像是一个映射关系。
P36 排序(上)
一个name值可能包含多个属性,那么dictionary后面的第二个属性就是一个类。
P36 排序(上)
PropertyMappingValue的类。Revert的值为true表示就需要反转。
P36 排序(上)
方法GetPropertyMapping,意思是通过两个类型,比如说通过EmloyeeDto和Employee这两个类型,就能把他俩之间的映射关系取出来。
取出来映射关系我们才能使用。
P36 排序(上)
 

结束

 

上一篇:航空后端部署4


下一篇:2021-06-16