EF Core中通过反射实现嵌套属性的动态OrderBy排序
实现支持嵌套属性的动态OrderBy扩展方法
你现有的OrderBy扩展方法仅能处理实体的直接属性,无法解析School.Name这类嵌套关联属性的路径。要解决这个问题,只需要修改ToLambda方法,使其能够逐层解析属性路径中的每一级嵌套:
修改后的完整代码
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName) { return source.OrderBy(ToLambda<T>(propertyName)); } private static Expression<Func<T, object>> ToLambda<T>(string propertyName) { var parameter = Expression.Parameter(typeof(T)); Expression property = parameter; // 分割属性路径,处理嵌套层级 foreach (var propName in propertyName.Split('.')) { property = Expression.Property(property, propName); } // 将最终属性转换为object类型,适配Func<T, object>的返回值 var propAsObject = Expression.Convert(property, typeof(object)); return Expression.Lambda<Func<T, object>>(propAsObject, parameter); }
关键修改说明
- 分割属性路径:用
.分割传入的propertyName,得到每一级的属性名称(比如"School.Name"会拆分为["School", "Name"])。 - 逐层构建表达式:从实体参数
parameter开始,依次获取每一级的属性表达式,最终得到嵌套属性的表达式(对应m => m.School.Name中的m.School.Name部分)。 - 类型转换:保持原有逻辑,将最终属性表达式转换为
object类型,确保和Func<T, object>委托的返回类型匹配。
使用示例
修改后即可直接通过嵌套属性路径调用排序:
var query = dbSet.AsQueryable(); query = query.OrderBy("School.Name"); var data = await query.ToListAsync();
这行代码的效果完全等价于手动编写Lambda表达式:
query = query.OrderBy(m => m.School.Name);
内容的提问来源于stack exchange,提问作者Jaroslav Langer
相关产品推荐
相关产品推荐

