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
相关产品推荐
相关产品推荐

