P36 排序(上)




排序分为哪几种情况。为集合类型的资源进行排序。排序通常是使用QueryString的这种形式。

表示按照倒叙排序。字段后面加空格。如果没有desc技术默认按照正序进行排序。

先按照companyName倒叙,再按照id正序排序。

争对谁来进行排序。面向外部的,俺么就是EmployeeDto,对dto的属性进行排序。


复杂的是dto里面name对应的是entity里面连个属性。这种情况如果要排序,肯定是要写一些代码来进行处理。

再就是age对应的出生日期。也需要单独处理。如果age按照正序排列的话,那么DateOfBirth就要按照倒叙进行排列。

写代码

这是提前写好的类。里面奶奶有一些分页的信息,还有一些可查询的字段等等。

这里第二个参数和第三个参数统一放到了paramsters里面了

下面这个方法的第二个和第三个参数也换成了paramsters

repository层的参数的替换

添加一个配需的属性。并给他赋一个默认值。如果没有传排序的属性,那么就按照默认值的字段进行排序。

默认按Name字段来

上面代码都是条件的过滤。这里写排序的逻辑。

统一变成小写,先按照FirstName排序,再按照LastName进行排序。

上面的代码,这块代码直接删除。


然后把最后悔这里的orderBy去掉

测试

先查询公司下的员工

根据name排序

让排序灵活并且复用

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


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

写代码

先把这段代码去掉

写上一行代码。ApplySort是一个排序的扩展方法。传入orderBy和 一个映射关系的Dictionary类型的



先来讲一下映射的思路,借助dotnet.core的DI容器到处注入。

要解决一个资源映射多个entity的属性的问题

可能需要反转顺序。比如age映射 出生日期

这个思路也是跟别人学的,也不是自己原创的。看起来也是挺麻烦的,

需要接入dotnetCore的DI容器,PropertyMappingService实现IPropertyMappingService的接口

IPropertyMapping也是一个接口。它里面有两个泛型类,TSource(相当于是dto)和TDestination(相当于是entity)

PropertyMapping里面有个属性Dictionary,Dictionary也是集合存放的是
一个PropertyMapping相当于是一条记录,就像是一个映射关系。

一个name值可能包含多个属性,那么dictionary后面的第二个属性就是一个类。

PropertyMappingValue的类。Revert的值为true表示就需要反转。

方法GetPropertyMapping,意思是通过两个类型,比如说通过EmloyeeDto和Employee这两个类型,就能把他俩之间的映射关系取出来。
取出来映射关系我们才能使用。

 

结束

 

posted @ 2020-12-13 21:26  高山-景行  阅读(146)  评论(0编辑  收藏  举报