You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET EF如何筛选满足跟进日期要求且最新跟进状态为指定值的客户

问题背景

我有以下数据表,每个客户对应多条跟进(Followups)记录:

表结构

Schema Image

示例数据

Data image

检索需求

需要筛选出同时满足以下两个条件的客户列表:

  • 存在至少一条跟进记录满足 Followups.attendedDate > customer.attendedDate
  • 客户的最新一条跟进记录的 Followup.statusid 为2、7、8、9中的任意一个

现有代码问题

原有代码先查询所有存在任意一条跟进状态符合要求的客户,再手动遍历移除不符合最新状态要求的记录,存在两个问题:

  1. 筛选逻辑冗余,查询和后处理两步操作性能更低
  2. 直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:45:03