Применительно к инфраструктуре сущности, методы расширения 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
, не перехватывая исключения?