记录EF 排序配上自定义的比较器
记录EF 排序配上自定义的比较器
前言
要求页面文件显示的时候能够按照序号去排序要求如下:
数据库有一个列存放文件名,如:
- 1.1文件
- 1.2文件
- 1.1.1文件
- 1.1.11文件1.0.txt
- 1.1.2(文件).pdf
现在需要实现查询的时候按照这个列排序,并且是按照序号排序。
查询的时候是按层级查询的,每次查询只会当前所在层,1 文件夹、2文件夹、3文件,然后进入1 文件夹 才会查询出 1.1文件..1.2文件夹,这没什么影响,主要实现的功能就是我查询的时候要排序,如果直接根据列名OrderBy是没用的,所以需要用到EF的自定义比较器,通过自己编写比较逻辑去完成排序。
代码实现
首先是Compare 方法中的 x 和 y 参数分别表示当前列的数据和当前列的下一个数据。
假设查询出来的数据第一条和第二条比对
- x:1.11文件
- y:1.1文件.pdf
这2个参数会进入GetFileNumber方法中将最前面的序号提取出来。
CompareTo方法会按照字典顺序进行比较。对于数字类型,CompareTo方法会按照数值大小进行比较。
- 如果返回值为负数(例如-1),表示第一个对象(x)小于第二个对象(y)。
- 如果返回值为零,表示两个对象相等。
- 如果返回值为正数(例如1),表示第一个对象(x)大于第二个对象(y)。
EF 在进行排序时,会根据 Compare 方法返回的整数值来确定对象的相对顺序。根据返回值的正负来决定对象的位置。
public int Compare(string x, string y)
{
    // 解析文件名中的数字部分
    int fileNumberX = GetFileNumber(x);
    int fileNumberY = GetFileNumber(y);
    // 比较数字部分
    int result = fileNumberX.CompareTo(fileNumberY);
    if (result == 0)
    {
    // 如果数字部分相同,则按照完整文件名进行比较
    result = x.CompareTo(y);
    }
    return result;
}
通过传递文件名,使用正则表达式去匹配文件名中的序号部分,获取到1.1.1之后,在进行.去切割获取最后面的数字,然后返回回去,回到上面的Compare方法去比对文件名序号大小。
private int GetFileNumber(string fileName)
{
    // 假设文件名的格式为数字序号 + "." + 文件类型(例如:1.1.1文件.pdf)
    // 提取数字序号部分
    try
    {
        // 使用正则表达式提取数字序号部分
        string pattern = @"(\d+(\.\d+)*)";
        Match match = Regex.Match(fileName, pattern);
        MatchCollection matches = Regex.Matches(fileName, pattern);
        if (matches.Count > 0)
        {
            string firstNumberPart=matches[0].Groups[1].Value;
            // 提取最后面的数字
            string[] parts = firstNumberPart.Split('.');
            int lastPartIndex = parts.Length - 1;
            int lastPart = int.Parse(parts[lastPartIndex]);
            return lastPart;
        }
        // 如果无法解析数字序号,则返回一个默认值或抛出异常,具体根据您的需求来处理
        // 这里返回一个负数作为默认值
        return -1;
    }
    catch
    {
        return -1;
    }
}
}
最关键的是需要实现 IComparer 接口的自定义比较器类,用于对字符串进行比较,上面的Compare和GetFileNumber写在方法内部即可。
public class FileNameComparer : IComparer<string>
{
     ...//上面的2给方法都要放在这里面
}
使用起来也很简单,注意列名需要是字符串类型的。
db.表名.OrderBy(s => s.列名,new FileNameComparer());
结尾
EF自定义比较器可以进行排序、查找、去重等操作,同时支持实体对象和字符串进行比较操作,可以去看看官方文档的介绍:
IComparer 接口:https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.icomparer?view=net-7.0
记录EF 排序配上自定义的比较器的更多相关文章
- Day 8:方法上自定义泛型、类上、接口上、泛型的上下限
		泛型 泛型是jdk1.5使用的新特性 泛型的好处: 1. 将运行时的异常提前至了编译时 2. 避免了无谓的强制类型转换 泛型在集合中的常见应用: ArrayList<Strin ... 
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
		Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ... 
- 记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb
		记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb 前段时间我个人Google服务器意外不能用,并且我犯了一件很低级的错误,直接在gcp讲服 ... 
- 在EntityFrameworkCore中记录EF修改日志,保存,修改字段的原始值,当前值,表名等信息
		突发奇想,想把业务修改的所有字段原始值和修改后的值,做一个记录,然后发现使用EF可以非常简单的实现这个功能 覆盖父类中的 SaveShanges() 方法 public new int SaveCha ... 
- 给Angularjs配上Requirejs
		给Angularjs配上Requirejs 需要考虑的事情: 1.js.css.template都按需加载,js主要就controller: * js和css都可以用requirejs和它的插件解决, ... 
- 19.翻译系列:EF 6中定义自定义的约定【EF 6 Code-First约定】
		原文链接:https://www.entityframeworktutorial.net/entityframework6/custom-conventions-codefirst.aspx EF 6 ... 
- 记录一次线上bug
		记录一次线上bug,总的来说就是弱网和重复点击.特殊值校验的问题. 测试场景一: 在3g网络或者使页面加载速度需要两秒左右的时候,输入学号,提交学生的缴费项目,提交完一个 学生的缴费后, ... 
- mysql选择上一条、下一条数据记录,排序上移、下移、置顶
		1.功能须要 完毕列表排序上移,下移,置顶功能.效果例如以下图所看到的: 2设置思路 设置一个rank为之间戳,通过选择上移,就是将本记录与上一条记录rank值交换,下移就是将本条记录与下一条记录ra ... 
- Java之ArrayList自定义排序,通过实现comparator比较器接口
		两种排序方式: 1.实体类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 2.在调用方法的 ... 
- SkyWalking配上告警更优秀
		前言 对于监控系统来说,不可能让人一直盯着监控看板,而更多的是以自动提醒的方式,比如邮件.短信或微信推送等,当达到或超出预设的告警指标时,就自动发送消息提醒,下面就来说说如何配置SkyWalking的 ... 
随机推荐
- 001_Cadence软件的安装与介绍
			001_Cadence软件的安装与介绍 软件版本16.6,软件下载:搜索PCB联盟; 安装步骤: 1) 把5个分卷的压缩包解压到同一文件夹; 2) 双击Setup.exe开始安装,先安装Lic ... 
- 我的 Kafka 旅程 - 概念 · 特点 · 组成 · 模式 · 应用
			系列目录 我的 Kafka 旅程 - 概念 · 特点 · 组成 · 模式 · 应用 我的 Kafka 旅程 - Linux下的安装 · 基础命令 · 集群 我的 Kafka 旅程 - Producer ... 
- ERROR: Error installing mysql2: ERROR: Failed to build gem native extension [@Ubuntu 15.04]
			参考文章: https://blog.csdn.net/a60919820/article/details/101847890 安装mysql 参考:https://www.cnblogs.com/h ... 
- 使用可视化工具redis-desktop-manager管理查询缓存。
			AnotherRedisDesktopManager https://gitee.com/qishibo/AnotherRedisDesktopManager/releases 下载windows版本 ... 
- JavaScript前端时间库moment.js
			1.获取当前时间 moment().format("YYYY-MM-DD HH:mm:ss"); moment().format("YYYY-MM-DD"); ... 
- salesforce零基础学习(一百三十六)零碎知识点小总结(八)
			本篇参考: Salesforce LWC学习(七) Navigation & Toast https://developer.salesforce.com/docs/platform/lwc/ ... 
- Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?
			Spring是一个基于Java的企业级应用程序开发框架,它使用了多种设计模式来实现其各种特性和功能.本文将介绍一些在Spring中使用的常见设计模式以及相应的代码示例和说明. 单例模式 单例模式是Sp ... 
- redis持久化存储数据(rdb和aof)
			rdb持久化存储数据 总的 redis持久化 防止数据丢失,持久化到本地,以文件形式保存 持久化的方式 ,两种 aof和 rdb模式 1.触发机制, - 手动执行save命令 - 或者配置触发条件 s ... 
- Python:当函数做为参数时的技巧
			我们之前在<Python技法3: 匿名函数.回调函数.高阶函数>中提到,可以通过lambda表达式来为函数设置默认参数,从而修改函数的参数个数: import math def dista ... 
- VMware Workstation解锁Mac系统
			VMware workstation在安装虚拟机的时候,如果是安装Windows.CentOS.Ubuntu等相关系统的话,仅仅需要一个系统镜像就可以顺利安装了. 但是如果想要安装苹果系统Mac的话, ... 
