.NET EF Core 按Patient首个关联组名称排序无效求助
问题描述
我定义了Patient、PatientGroupMembership、PatientGroup三个实体类:
Patient包含导航属性PatientGroupMembershipsPatientGroupMembership关联PatientGroupPatientGroup拥有Name属性
需求是按每个Patient的首个PatientGroupMembership对应的PatientGroup.Name对Patient进行排序。
目前已实现加载数据时将PatientGroupMemberships按PatientGroup.Name排序:
var query = patients .Include(x => x.PatientGroupMemberships!.OrderBy(pgm => pgm.PatientGroup!.Name)) .ThenInclude(p => p.PatientGroup) .AsNoTracking();
但尝试按首个PatientGroup.Name对Patient排序时结果不符合预期,相关代码:
private static IQueryable<Patient> SortByPatientGroups(IQueryable<Patient> query, bool isDescendingOrder) { var orderedQuery = isDescendingOrder ? query.OrderByDescending(x => x.PatientGroupMemberships .Select(pgm => pgm.PatientGroup.Name) .FirstOrDefault()) : query.OrderBy(x => x.PatientGroupMemberships .Select(pgm => pgm.PatientGroup.Name) .FirstOrDefault()); return orderedQuery; }
解决方案
问题核心:你在Include中对PatientGroupMemberships的排序仅影响内存中加载的实体集合顺序,EF Core处理OrderBy里的FirstOrDefault()时,是直接在数据库层面查询PatientGroupMemberships,不会沿用Include的排序规则。
要让数据库正确计算每个Patient对应的首个分组名称(按分组名称排序后的第一个),必须在排序逻辑的子查询中显式指定排序:
private static IQueryable<Patient> SortByPatientGroups(IQueryable<Patient> query, bool isDescendingOrder) { var orderedQuery = isDescendingOrder ? query.OrderByDescending(x => x.PatientGroupMemberships .OrderBy(pgm => pgm.PatientGroup.Name) // 显式指定排序规则 .Select(pgm => pgm.PatientGroup.Name) .FirstOrDefault()) : query.OrderBy(x => x.PatientGroupMemberships .OrderBy(pgm => pgm.PatientGroup.Name) // 显式指定排序规则 .Select(pgm => pgm.PatientGroup.Name) .FirstOrDefault()); return orderedQuery; }
关键说明
- EF Core的
Include排序仅作用于加载到内存的导航属性集合,不会影响查询的其他子查询逻辑 - 只有在排序的子查询中明确
OrderBy,数据库才能正确筛选出每个Patient对应的目标分组名称 - 如果需要按
PatientGroupMembership的其他字段排序(比如创建时间),替换OrderBy中的排序字段即可
内容的提问来源于stack exchange,提问作者Manoj Soma
相关产品推荐
相关产品推荐

