首页 > 其他分享 >记录EF 排序配上自定义的比较器

记录EF 排序配上自定义的比较器

时间:2023-10-23 18:44:32浏览次数:39  
标签:1.1 自定义 int 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 方法中的 xy 参数分别表示当前列的数据和当前列的下一个数据。

假设查询出来的数据第一条和第二条比对

  • 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 接口的自定义比较器类,用于对字符串进行比较,上面的CompareGetFileNumber写在方法内部即可。

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

OrderBy:https://learn.microsoft.com/zh-cn/dotnet/api/system.data.entity.core.common.commandtrees.expressionbuilder.dbexpressionbuilder.orderby?view=entity-framework-6.2.0

标签:1.1,自定义,int,EF,序号,排序
From: https://www.cnblogs.com/ZYPLJ/p/17783188.html

相关文章

  • Oracle中通过组内排序实现行转列(三)
    1纵表平铺1.1原数据 1.2平铺结果:每个班级按照年龄从小到大平铺为一行select*from(selectrt.class,row_number()over(partitionbyrt.classorderbyrt.age)row_num,rt.sno,rt.snamefromrank_tes......
  • Effective C++: 改善程序与设计的55个具体做法pdf电子版下载
    EffectiveC++:改善程序与设计的55个具体做法pdf电子版下载作者: [美]ScottMeyers原作名: EffectiveC++:55SpecificWaystoImproveYourProgramsandDesigns出版年: 2011-1-1ISBN: 9787121123320连接提取码:og02关于这本书有个颇有名气的段子:C++程序员可以分为两类,读......
  • IDEA工具第二篇:自定义Java方法注释模板
    网上搜索类似的文章有很多,但是一味的复制粘贴总会出现各种奇葩问题,最后然并卵!今天特意自己研究琢磨一下,将最终结果分享给大家,100%亲测可用。一、说明想必大家都用过Eclipse的方法注释生成,方法上输入/**,回车走你,巴拉巴拉如下的注释便生成了,今天就悄悄告诉大家如何自定义这样的模......
  • mysql 自定义函数的调用及赋值
    函数调用:select函数名(参数);函数返回值赋值:set变量名=(select函数名(参数));select函数名(参数)into变量名;示例:自定义函数内容 selecttest4(5)intoaa;setbb=(selecttest4(10));selectaa,bb; ......
  • CadQuery API Reference(待完善)
    CadQueryAPIReferenceAPI主要可以分为4个部分•Sketch–构建2D草图•Workplane–拓扑关系的载体,工作平面•Selector–筛选和选择器•Assembly–装配体操作1.Sketchinitialization草图初始化Sketch(parent,locs)2Dsketch.Sketch.importDXF(filena......
  • 学会 CompletableFuture:让你的代码免受阻塞之苦!
    来源:https://juejin.cn/post/6844904024332828685写在前面通过阅读本篇文章你将了解到:CompletableFuture的使用CompletableFure异步和同步的性能测试已经有了Future为什么仍需要在JDK1.8中引入CompletableFutureCompletableFuture的应用场景对CompletableFuture的使用优化......
  • Reflect
    概述Reflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新API。Reflect对象的设计目的有这样几个。(1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect......
  • Pset_SpaceFireSafetyRequirements
    Pset_SpaceFireSafetyRequirements空间消防安全要求:适用于IfcSpace或IfcZone事件的空间消防相关属性。  NameTypeDescriptionFireRiskFactorP_SINGLEVALUE / IfcLabelBrandgefahrenklasseBrandgefahrenklassedesRaums,angegebennachdernationalenoder......
  • Makefile基础使用和实战详解
    一、基础Makefile其实只是一个指示make程序如何为我们工作的命令文件,我们说Makefile其实是在说make。而对于项目来说,Makefile是指软件项目的编译环境。Makefile的好坏对于项目开发有些什么影响呢?设计得好的Makefile,当我们重新编译时,只需编译那些上次编译成功后修改过的......
  • Spring Data JPA : 查-分页排序
    1.分页查询 pageNumber是从0开始,pageNumber=0,pageSize=3就是获取前3条参考创建分页Pageable变量创建Pageable对象,再查询importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.domain.Page;import......