记录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的 ...
随机推荐
- 为什么我反对过度使用TypeScript?
前言 在2024年, TypeScript肯定算不上什么新鲜的技术. 但是经过长时间的使用, 我认为可以使用, 但是要适度. 类型跟不上业务的变化 我们知道TypeScript的类型定义是业务的体现. ...
- 还在用Jenkins?快来试试这款比Jenkins简而轻的自动部署软件!
大家好,我是 Java陈序员. 在工作中,你是否遇到过团队中没有专业的运维,开发还要做运维的活,需要自己手动构建.部署项目? 不同的项目还有不同的部署命令,需要使用 SSH 工具连接远程服务器和使用 ...
- 如何提高WordPress的加载速度
针对wordpress加载速度慢的原因: 1. 由于Wordpress系统默认使用谷歌字体,在国内谷歌域名被屏蔽,所以导致操作反应慢.对于很多商业主题默认使用了谷歌字体.谷歌ajax库.谷歌地图等谷歌 ...
- Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
Spring中的Bean是否线程安全取决于Bean的作用域(scope).Spring提供了几种不同的Scope,其中包括Singleton.Prototype.Request.Session.Glo ...
- 关于文心一言不能打开F12开发者工具
直接被JS写死的debugger关键字下了断点.行吧,不让调试就不让调试吧,关闭开发者工具之后,直接跳到了空白页. 开发者工具Ctrl+F8可以禁用断点调试 点击查看代码 <!DOCTYPE h ...
- v-for比v-if优先级更高
在V2当中,v-for的优先级更高,而在V3当中,则是v-if的优先级更高. 在V3当中,做了v-if的提升优化,去除了没有必要的计算, 但同时也会带来一个无法取到v-for当中遍历的item问题, ...
- 当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!
一.写在开头 依稀记得多年以前的一场面试中,面试官从Java并发编程问到了锁,从锁问到了原子性,从原子性问到了Atomic类库(对着JUC包进行了刨根问底),从Atomic问到了CAS算法,紧接着又有 ...
- 在Cocos2d中拖动组件并吸附到节点
最近在学习制作小游戏,要实现一个拖动吸附效果,这里简单实现一下 代码实现 定义节点和函数功能 在properties里新建一个对象,用来接收目标区域的节点 properties:{ sense: { ...
- yapi 自动化安装遇到的问题
yapi版本: 1.10.2 yapi server 启动之后 填写好配置,点击开始部署,发现控制台打印如下日志 (node:19879) Warning: Accessing non-existen ...
- Android OpenMAX(一)漫谈
在开始正式的学习前,我们先来聊一聊Android音视频开发中的一些问题.感受与想法.(有一点要事先说明,我的问题与答案.想法并不一定正确,请读者带着审慎的思考来阅读,后续的文章也是一样,希望读者边阅读 ...