Сортировка сущностей SQL Затем LINQ для сущностей GroupBy не возвращает IOrderedQueryable - PullRequest
1 голос
/ 12 марта 2012

Работает: Мой пользовательский интерфейс отправляет сущность sql сортировки выражений из jqGrid в мой DAL, а затем применяет некоторые условия Where, которые возвращаются на мой сервисный уровень. Мой сервисный слой затем создаст объект PaginatedList, который применяет Skip () .. Take () к IQueryable. Пример:

var qry = ((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery<TEntity>(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL()); 
//GetEntitySQL() i.e. "it.WorksheetID ASC"
return qry.Where(p=> pStatus == "blah").Skip(5).Take(10);

Не работает: Применяя GroupBy (), затем Select (), который возвращает список объектов того же типа (рабочий лист). Пример:

var qry = ((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery<TEntity>(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL());

var qryGrouped = qry.GroupBy(pWorksheet => pWorksheet.ParticipantID)
.Select(pGroup => new {Group = pGroup, LatestWorksheetID = pGroup.Max(pWorksheet => pWorksheet.WorksheetID)})
.Select(p => p.Group.FirstOrDefault(pWorksheet => pWorksheet.WorksheetID == p.LatestWorksheetID)); 

return qryGrouped.Skip(5).Take(10); //throws exception.

Выдает исключение NotSupportedException: метод «Пропустить» поддерживается только для отсортированного ввода в LINQ to Entities. Метод 'OrderBy' должен быть вызван перед методом 'Пропустить'.

Мне кажется, что первый фрагмент действительно возвращает IOrderedQueryable, который применяет выражение сортировки esql, а второй фрагмент - нет? Или, возможно, GroupBy () удаляет порядок запроса / коллекции? Если это так, и, поскольку esql должен применяться ДО LINQ to Entities, как я могу выполнить сортировку sql + LINQ GroupBy?

Связанный:
Когда ObjectQuery действительно является IOrderedQueryable?
Почему мы не можем смешивать ESQL и LINQ TO Entities

1 Ответ

1 голос
/ 13 марта 2012

GroupBy() возвращает IGrouping<int, Worksheet>.Фактический объект - ObjectQuery, возвращаемый как IQueryable.Вы связались с моим вопросом (когда ObjectQuery действительно является IOrderedQueryable?), Поэтому вы знаете, что тот факт, что этот ObjectQuery также реализует IOrderedQueryable, не обязательно означает, что он действительно ведет себя как таковой.

В более элементарный, связанный, вопрос , Джон Скит сделал различие между фактическим типом и типом времени компиляции.Тип времени компиляции (IQueryable) - вот что имеет значение.

Таким образом, GroupBy фактически отменяет предыдущий OrderBy.При быстром тестировании аналогичного случая я увидел, что даже порядок в группировке пропал.Вывод: вам придется повторно применить OrderBy для успешного выполнения Skip.

...