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这两个类型,就能把他俩之间的映射关系取出来。
取出来映射关系我们才能使用。
结束