使用System.Linq.Dynamic.Core对复杂对象执行OrderBy排序报错如何解决
错误原因
System.Linq.Dynamic.Core.Exceptions.ParseException: 'No property or field 'Name' exists in type 'IEnumerable
1'' 该报错是因为Students是IEnumerable集合类型,本身没有Name属性,只有集合内的单个Student对象才有Name属性,直接写Students.Name相当于尝试访问集合类型的Name`属性,触发异常。
解决方案
根据你的业务需求选择对应实现方式:
- 场景1:按每个课程下第一个学生的姓名排序
调用集合的First()方法获取单个Student对象后再访问Name属性即可:
using (var context = new SchoolContext()) { var list = context.Courses.Include("Students").AsQueryable(); var result = list.OrderBy("Students.First().Name").ToList(); // 注意原代码遍历的是未排序的list,这里改为遍历排序后的result foreach (var item in result) { Console.WriteLine("Hello World!" + item.Name ); } }
如果存在课程下没有学生的情况,可以改用FirstOrDefault()处理空值,写法如下:
var result = list.OrderBy("Students.FirstOrDefault() == null ? \"\" : Students.FirstOrDefault().Name").ToList();
- 场景2:按课程下所有学生姓名的极值排序
如果需要按课程下学生姓名最小/最大值排序,可使用Min()/Max()方法:
// 按学生姓名最小值排序 var result = list.OrderBy("Students.Min(Name)").ToList(); // 按学生姓名最大值排序 var result = list.OrderBy("Students.Max(Name)").ToList();
- 场景3:查询所有学生并按学生姓名排序
如果你的需求是获取学生列表,按学生姓名排序并关联课程信息,直接查询Students集合即可:
using (var context = new SchoolContext()) { var list = context.Students.Include("Course").AsQueryable(); var result = list.OrderBy("Name").ToList(); foreach (var item in result) { Console.WriteLine($"Hello World! 课程:{item.Course.Name} 学生:{item.Name}"); } }
内容的提问来源于stack exchange,提问作者Rahul.R.Parmar
相关产品推荐
相关产品推荐

