Подтвердить что ты не робот

Как я могу определить, является ли IQueryable IOrderedQueryable?

У меня есть IQueryable. Я не называл OrderBy на нем или каким-то другим образом ничего не делал.

Если я это сделаю:

// for some reason, isItOrdered is always true
var isItOrdered = myQueryable is IOrderedQueryable<T>

Почему это всегда так? (Похоже, этого не должно быть.) И, что более важно, как я могу узнать, был ли уже заказан IQueryable? (т.е. действительно является IOrderedQueryable)

Я хотел бы сделать что-то вроде:

if (myQueryable is IOrderedQueryable<T>)
  myQueryable = myQueryable.ThenBy(...);
else
  myQueryable = myQueryable.OrderBy(...);
4b9b3361

Ответ 1

Вы не указали, с чего начать свой запрос, но, возможно, он каким-то образом заказан?

То, что у вас есть, проверяет, действительно ли это IOrderedQueryable<T> - я подозреваю, что только ваш поставщик запросов всегда предоставляет упорядоченный запрос, даже если порядок не очевиден.

EDIT: Хорошо, что-то еще вы можете попробовать:

if (typeof(IOrderedQueryable<T>).IsAssignableFrom(myQueryable.Expression.Type))

... или вообще распечатать myQueryable.Expression.Type и посмотреть, как он выглядит.

Ответ 2

Это похоже на работу

if (query.Expression.Type == typeof(IOrderedQueryable<T>))
    myQueryable = myQueryable.ThenBy(...);
else
    myQueryable = myQueryable.OrderBy(...);

Ответ 3

Некоторые реализации IQueryable используют один и тот же класс для IOrderedQueryable<T>.

Нет смысла проверять, действительно ли он уже заказан, если вы не знаете, как как он заказывал, иначе вы можете заказать то же самое свойство, когда вы вызываете ThenBy().

Кроме того, вы не можете вызывать Queryable.ThenBy() на myQueryable, если это ссылка на IQueryable - вы должны сначала перенести его:

if (myQueryable is IOrderedQueryable<T>)
   myQueryable = ((IOrderedQueryable<T>) myQueryable).ThenBy(...);