猿问题 - 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();

posted @ 2022-04-26 12:05  初久的私房菜  阅读(430)  评论(1编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/