一个很有意思的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
}
public class InvoiceItem {
public InvoiceNo InvoiceNo {get;set;}
}
public record InvoiceNo {
public string Code {get;set;}
}
var prediscate= PredicateBuilder.New
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();