Применительно к инфраструктуре сущности, методы расширения Select() и OrderBy() возвращают a ObjectQuery, который определяется как:
public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
    IQueryable<T>, <... more interfaces>
Тип возврата Select() равен IQueryable<T>, а <<26 > - IOrderedQueryable<T>. Таким образом, вы можете сказать, что оба возвращают один и тот же тип, но в другой оболочке. К счастью, потому что теперь мы можем применить ThenBy после вызова OrderBy.
Теперь моя проблема.
Скажем, у меня есть это:
var query = context.Plots.Where(p => p.TrialId == 21);
Это дает мне IQueryable<Plot>, который является ObjectQuery<Plot>. Но это также IOrderedQueryable:
var b = query is IOrderedQueryable<Plot>; // True!
Но все же:
var query2 = query.ThenBy(p => p.Number); // Does not compile.
// 'IQueryable<Plot>' does not contain a definition for 'ThenBy'
// and no extension method 'ThenBy' ....
Когда я это сделаю:
var query2 = ((IOrderedQueryable<Plot>)query).ThenBy(p => p.Number);
Он компилируется, но дает исключение во время выполнения:
Выражение типа '
IQueryable`1[Plot]' не может использоваться для параметра типа'IOrderedQueryable`1[Plot]'метода'IOrderedQueryable`1[Plot] ThenBy[Plot,Nullable`1](IOrderedQueryable`1[Plot], Expressions.Expression`1[System.Func`2[Plot,System.Nullable`1[System.Int32]]])'
Листинг выполняется (я проверил), но параметр ThenBy по-прежнему рассматривается как IQueryable (что меня немного озадачивает).
Теперь предположим, что какой-то метод возвращает ObjectQuery<Plot> мне как IQueryable<Plot> (например, Select()). Что делать, если я хочу знать, можно ли вызывать ThenBy на возвращаемом объекте. Как я могу понять это, если ObjectQuery является "реальным" или "поддельным" IOrderedQueryable, не перехватывая исключения?
