记录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的 ...
随机推荐
- xtrabackup备份恢复
tar -xzvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz cd percona-xtrabackup-2.1.9-Linux-x86_64/ ...
- ITIL是标准吗?
ITIL不是标准 OGC:是一个推荐的管理框架,一个模版,可根据运维实践自由裁量落地 itil诞生环境:欧美思维.欧美文化.欧美制度.欧美人文习惯.... 对欧美来说可能是最佳实践,但是对中国特色文化 ...
- DNS(3) -- dns常用命令-rndc-dig-host-nslookup
目录 1 bind自带客户端命令 1.1 rndc命令 1.2 检查配置文件语法 2 客户端测试命令 2.1 dig命令 2.2 host命令 2.3 nslookup命令 1 bind自带客户端命令 ...
- Ubuntu实现与主机Windows复制粘贴(安装VMware Tools)
若不能实现主机与客户机间粘贴复制执行以下命令 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo ...
- Aliplayer通过HLS流式播放Aliyun Mps(媒体处理)转码的加密视频
前言 公司需求,上传的视频需要加上公司Logo,同时播放需要采用流式播放禁止下载. 现有的环境在阿里云上,所以自然想到了阿里云的产品[媒体处理]的转码功能. 转码配置 配置比较简单,采用阿里云HLS标 ...
- 用 C 语言开发一门编程语言 — 异常处理
目录 文章目录 目录 前文列表 异常捕获 定义 Lisp Value 函数 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> <用 C 语言开发一门编程语言 - 跨平台 ...
- windows 文件夹添加备注
1,选中希望改动的文件夹,然后右键"单击",选择"属性"按钮. 2,打开"自定义"面板,选择"更改图标",将原来的默认文 ...
- AIRIOT物联网低代码平台如何配置db-driver驱动?
设备接入能力包括接入驱动类型及接入数据量,性能方面需要考量数据采集的稳定性和驱动的丰富性等多个因素.用户在选择物联网平台时,往往存在一些误区,比如很关注平台支持的驱动数量,越多越好.市场上确有支持上千 ...
- Linux系统修改命令提示符格式及颜色
放到全局环境变量.注意自己是放全局还是自己家目录下环境的 echo "export PS1='[\[\e[35;1m\]\u\[\e[31;1m\]@\[\e[34;1m\]\h \[\e[ ...
- uniapp 微信支付,小程序支付,支付宝支付问题汇总
背景介绍 uni-app 可以转微信小程序或直接打包 APP ,支付模块使用统一方法 uni.requestPayment 但是不同平台参数不同容易出现混淆错乱. 相关网站 uni-app 统一支付: ...