我有以下代码:
public IOrderedQueryable<T> CreateOrderedList<T>(IQueryable<T> items, string orderByprop, string descProperty)
{
if (!string.IsNullOrEmpty(orderByprop) && !string.IsNullOrEmpty(descProperty))
{
return items.OrderedList(orderByprop, descProperty == "desc");
}
return (IOrderedQueryable<T>)items;
}
public static IOrderedQueryable<T> OrderedList<T>(this IQueryable<T> items, string filterProperty, bool descending = false)
{
var propertyInfo = typeof(T).GetProperty(filterProperty ?? string.Empty, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (propertyInfo == null)
{
throw new Exception("Value not found on T");
}
dynamic OrderBy(T o) => propertyInfo.GetValue(o, null);
return (descending ? (IOrderedQueryable<T>)items.OrderByDescending(OrderBy) : (IOrderedQueryable<T>)items.OrderBy(OrderBy));
}
当我尝试执行此操作时,它给了我以下错误:
无法将类型为System.Linq.OrderedEnumerable`2 [Logic.Models.CRM.Project,System.Object]的对象转换为类型为System.Linq.IOrderedQueryable`1 [Logic.Models.CRM.Project]的对象
但是,我将更多代码链接到查询(数据过滤),因此我需要对象保持IQueryable,以便稍后实现查询。如何实现此功能?
答案 0 :(得分:1)
我已经解决了我的问题,只需要做一个小小的改变:
dynamic OrderBy(T o) => propertyInfo.GetValue(o, null);
应该是
Expression<Func<T, dynamic>> orderBy = o => propertyInfo.GetValue(o, null);
因为我使用了委托而不是表达式,所以这必须迫使.NET来实现查询而不是扩展表达式
答案 1 :(得分:0)
尝试以下方法:
return descending ? items.Cast<T>.OrderByDescending(OrderBy)
:items.Cast<T>.OrderBy(OrderBy)