Работает: Мой пользовательский интерфейс отправляет сущность 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