VB.NET EF如何筛选满足跟进日期要求且最新跟进状态为指定值的客户
问题背景
我有以下数据表,每个客户对应多条跟进(Followups)记录:
表结构

示例数据

检索需求
需要筛选出同时满足以下两个条件的客户列表:
- 存在至少一条跟进记录满足
Followups.attendedDate > customer.attendedDate - 客户的最新一条跟进记录的
Followup.statusid为2、7、8、9中的任意一个
现有代码问题
原有代码先查询所有存在任意一条跟进状态符合要求的客户,再手动遍历移除不符合最新状态要求的记录,存在两个问题:
- 筛选逻辑冗余,查询和后处理两步操作性能更低
- 直接使用
cust.FollowUps.Last取最新跟进记录不可靠,如果FollowUps集合的默认排序不是按跟进时间倒序,会取到错误的记录
优化修改方案
直接在EF查询层完成所有筛选逻辑,无需额外后处理,代码如下:
' 预定义允许的跟进状态列表 Dim allowedStatus As Integer() = {2, 7, 8, 9} Dim Result As List(Of Customer) = Await db.Customers ' 基础过滤:跟进人不为空 .Where(Function(x) x.AttendedBy IsNot Nothing ' 条件1:存在跟进记录时间晚于客户的参与时间 AndAlso x.FollowUps.Any(Function(f) f.AttendedDate > x.AttendedDate) ' 条件2:最新跟进记录的状态在允许列表中 AndAlso allowedStatus.Contains(x.FollowUps.OrderByDescending(Function(f) f.AttendedDate).First().StatusID)) ' 按客户参与时间倒序排序 .OrderByDescending(Function(x) x.AttendedDate) ' 加载关联数据 .Include(Function(x) x.FollowUps.Select(Function(y) y.CallStatu)) .ToListAsync
补充说明
如果需要保留原有后处理的实现方式,需修正取最新跟进记录的逻辑,修正后的后处理代码如下:
Dim allowedStatus As Integer() = {2, 7, 8, 9} Dim RemoveList As New List(Of Customer) For Each cust As Customer In Result ' 按跟进时间倒序取最新的跟进记录 Dim latestFollow = cust.FollowUps.OrderByDescending(Function(f) f.AttendedDate).FirstOrDefault() ' 无跟进记录、或最新跟进状态不符合要求的客户加入移除列表 If latestFollow Is Nothing OrElse Not allowedStatus.Contains(latestFollow.StatusID) Then RemoveList.Add(cust) End If Next For Each Cust As Customer In RemoveList Result.Remove(Cust) Next
内容的提问来源于stack exchange,提问作者Parag
相关产品推荐
相关产品推荐

