Как создать IQueryable, содержащий OrderBy без материализации - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код:

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, чтобы запрос материализовался позже.Как я могу реализовать эту функциональность?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я решил свою проблему, и потребовалось только одно небольшое изменение:

dynamic OrderBy(T o) => propertyInfo.GetValue(o, null);

должно было быть

Expression<Func<T, dynamic>> orderBy = o => propertyInfo.GetValue(o, null);

Поскольку я использовал делегат вместо выражения, этоДолжно быть, вынудили .NET материализовать запрос вместо расширения выражения

0 голосов
/ 06 декабря 2018

Попробуйте следующее:

return descending ? items.Cast<T>.OrderByDescending(OrderBy) 
                  :items.Cast<T>.OrderBy(OrderBy)
...