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

C#使用Entity Framework带条件查询关联表如何获取最新Visit记录

解决方法

你的原写法无法获取最新Visit的核心原因是:Include默认加载关联表的所有匹配数据,如果SurgeryDate和Visit是一对多关系,直接关联单个Visit属性只会返回匹配到的第一条记录。

方案1:EF Core 5.0+ 过滤Include(最简写法)

EF Core 5及以上版本支持在Include中添加排序、过滤逻辑,直接取最大Id的最新Visit:

aList = db.SurgeryDates
    .Where(d => d.date == surgeryDateCbx.DateTime.Date)
    // 注意:如果你的SurgeryDate实体中Visit是集合类型,导航属性名是Visits,替换此处的Visit为Visits
    .Include(d => d.Visits.OrderByDescending(v => v.Id).Take(1))
    .ThenInclude(v => v.Patient)
    .ToList();

加载完成后,每条SurgeryDate的Visits集合的第一条就是最新的Visit记录,你可以手动赋值到单个Visit属性方便调用。

方案2:投影查询(兼容所有EF版本,性能更优)

如果你的EF版本不支持过滤Include,或者不想修改导航属性类型,用投影方式先查所需数据再映射:

// 先查询匿名类临时存储数据
var tempResult = db.SurgeryDates
    .Where(d => d.date == surgeryDateCbx.DateTime.Date)
    .Select(d => new
    {
        SurgeryDateEntity = d,
        LatestVisit = d.Visits.OrderByDescending(v => v.Id).FirstOrDefault(),
        RelatedPatient = d.Visits.OrderByDescending(v => v.Id).FirstOrDefault().Patient
    })
    .ToList();

// 映射到List<SurgeryDate>类型
aList = tempResult.Select(item =>
{
    item.SurgeryDateEntity.Visit = item.LatestVisit;
    if (item.LatestVisit != null)
    {
        item.LatestVisit.Patient = item.RelatedPatient;
    }
    return item.SurgeryDateEntity;
}).ToList();

注意事项

  • 确认SurgeryDate实体的Visit导航属性配置正确:一对多关系下需要定义为public ICollection<Visit> Visits { get; set; }集合类型,不能直接定义为单个Visit属性
  • 如果是一对一关联仍出现多条数据,需要检查数据库外键约束是否正确,是否存在重复visitId的异常数据

内容的提问来源于stack exchange,提问作者SHADOW.NET

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:39:00