我希望能够在将订单参数作为字符串传递的同时编写实体框架查询并在数据库引擎上对数据进行排序。
我通过使用反射找到了一种解决方法,它对于第一级子属性非常有效,但是当我尝试通过嵌套属性进行排序时,我得到了NullReferenceException(在这种情况下为“ City.Name”)。
public override IEnumerable<CORE.Models.BaseModel> SortAndGetRange(int start, int take, string prop, OrderBy order)
{
return order == OrderBy.ASC ?
Entity.Include(x => x.City).ThenInclude(x => x.Country).OrderBy(x => GetProp(x, prop)).Skip(start).Take(take) :
Entity.Include(x => x.City).ThenInclude(x => x.Country).OrderByDescending(x => GetProp(x, prop)).Skip(start).Take(take);
}
此方法返回想要的属性:
public static object GetProp(object o, string property)
{
foreach (var prop in property.Split(".").Select(x => o.GetType().GetProperty(x)))
{
o = prop.GetValue(o, null);
}
return o;
}
似乎OrderBy方法忽略了Include和ThenInclude,因此City属性始终为空。
是否有解决方案,或者完整的方法是错误的?