Как я могу определить, является ли 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(...);
Ответы
Ответ 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(...);