zoukankan      html  css  js  c++  java
  • 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这两个类型,就能把他俩之间的映射关系取出来。
    取出来映射关系我们才能使用。

     

    结束

  • 相关阅读:
    spring定时器的cronexpression表达式
    Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)
    ORA-12505, TNS:listener does not currently know of SID given in connect desc
    The Network Adapter could not establish the connection
    Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别
    大道至简、大智若愚—GO语言最佳详解实践
    rsync使用详解
    一次TIME_WAIT和CLOSE_WAIT故障和解决办法
    Go的CSP并发模型实现:M, P, G
    如何优雅打印nginx header和body
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/14130412.html
Copyright © 2011-2022 走看看