• 猿问题 EF如何实现多匹配模糊搜索


    一个很有意思的EF查询例子

    举例 发票聚合根,有发票项,发票项会有一个发票编号,编号开头的前几个字母会有一定的含义,所以将发票编号抽离成了值对象

    正常:根据聚合根带出发票项,这样业务没有问题,


    新需求,统计发票中,发票项的发票编号包含某些编号开头的发票。

    早期写法,查询所有发票拉入到内存中,然后进行发票编号筛选。

    举例:一条发票假如800个发票项,全库就算只有1w条发票数据 = 17001w = 700w的数据量,项目会非常慢

    要求:提高查询效率从查询出发优化查询速度

    大家如果有兴趣可以把思路写在评论上。


    思路提示: 我们目标的SQL样子:Where InvoiceNo like 'ASC%' or InvoiceNo like 'PUC%' or InvoiceNo like 'UD%'


    代码示例

    public class Invoice {

    public string Name {get;set;}

    public virtual ICollection InvoiceItems { get; set; }

    }

    public class InvoiceItem {

    public InvoiceNo InvoiceNo {get;set;}

    }

    public record InvoiceNo {

    public string Code {get;set;}

    }


    var prediscate= PredicateBuilder.New(true);

    foreach (var no in input.InvoiceItemNo)
    {
    prediscate = prediscate.Or(c=> c.InvoiceItem.Any(q=>EF.Functions.Like(q.InvoiceNo,$"{no}%")));
    }

    DbContext.Invoice .Include(x=> x.InvoiceItem).where(prediscate).AsNoTracking().ToList();

  • 相关阅读:
    JavaScript_01简介,基本语法,运算符
    JAVA_内部类
    JAVA_接口_默认方法&静态方法
    软件工程_01面向对象分析
    mybatis_16逆向工程
    mybatis_15整合ehcache
    mybatis_14二级缓存
    mybatis_13一级缓存
    mybatis_12延时加载_懒加载
    JWT如何在Spring Cloud微服务系统中在服务相互调时传递
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/16194244.html
Copyright © 2020-2023  润新知