Я воспроизвел ошибку (в более простом примере) и считаю, что невозможно найти какие-либо SortExpression
, которые могли бы выполнить сортировку по количеству детей.
Я видел две важные дополнительные информации:
- Исключение, которое выдается при нажатии на заголовок столбца:
EntitySqlException
- Последний метод в трассировке стека, который в конечном итоге выдает исключение:
EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)
ExecuteSelect - это abstract
метод DataSourceView
, который переопределяется различными конкретными элементами управления источником данных для выполнения фактической работы по загрузке данных из хранилища данных. В случае EntityDataSource
соответствующим представлением является EntityDataSourceView
и из сгенерированного исключения - EntitySqlException
- я бы пришел к выводу, что ExecuteSelect
строит запрос, используя Entity SQL .
Аргумент DataSourceSelectArguments
содержит параметры, определенные в EntityDateSource
, а также SortExpression
, который, скорее всего, является просто выражением сортировки, которое вы указали в TemplateField
. Они используются для составления окончательного запроса в Entity SQL.
Я бы предположил, что SortExpression
просто передается как предложение ORDER BY
в выражении Entity SQL. Это будет выглядеть так:
ORDER BY Children.Count
Но это недействительный Entity SQL. Вы можете использовать пунктирные пути для ссылки навигации, но вы не можете использовать какие-либо "похожие на LINQ" методы или свойства (например, Count
) коллекции навигации в Entity SQL.
Можно написать действительный Entity SQL, отсортированный по количеству детей. Согласно этому примеру (ищите «Упорядочить по связанным объектам» в файле) правильный оператор Entity SQL будет:
"SELECT VALUE p2.p
FROM (SELECT p, ANYELEMENT(SELECT VALUE Count(c.ChildId) FROM p.Children AS c)
AS childCount
FROM Parents AS p)
AS p2
ORDER BY p2.childCount"
(Это так трудно читать, что я даже не знаю, как сделать отступ в семантически правильном коде).
Я думаю, что эта конструкция ANYELEMENT(SELECT...
является «подзапросом», о котором говорит исключение и который он хочет иметь для подсчета элементов дочерней коллекции.
Очевидно, что вы не можете передать p2.childCount
в SortExpression
без всего подзапроса, который определяет p2
.
Мой вывод: нет надежды найти работающую SortExpression
для подсчета детей.
Может быть, есть способ без использования SortExpression
- например, перехватить событие click в заголовке и затем построить полный запрос вручную в обработчике событий, но я не совсем знаю, если и как это возможно.
Почему потребители EntityDataSource
и GridView
должны сами это выяснить? Вы когда-нибудь видели документированное: " Когда источник данных имеет тип EntityDataSource
, SortExpression
из TemplateField
в GridView
должен быть действительным Entity SQL ORDER BY
предложением ."Я не сделал. Просто что-то вроде: «SortExpression
- это выражение для сортировки».
К сожалению, поскольку нигде четко не указано, что происходит с SortExpression
, каков правильный синтаксис и какие выражения поддерживаются или нет, этот ответ является скорее предположением, чем ответом.