I have the following code:
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));
}
When I try to execute this, it gives me the following error :
Can't convert object of type System.Linq.OrderedEnumerable`2[Logic.Models.CRM.Project,System.Object] to object of type System.Linq.IOrderedQueryable`1[Logic.Models.CRM.Project].
I however chaining more code to the query (filtering of data), so I need the object to stay an IQueryable, so that the query materializes later. How can I implement this functionality?