作品:我的 UI 将实体 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 中的排序输入支持方法“Skip”。必须在方法“Skip”之前调用方法“OrderBy”。
在我看来,第一个片段确实返回了一个应用 esql 排序表达式的 IOrderedQueryable,但第二个片段没有?或者 GroupBy() 是否删除了查询/集合的顺序?如果是这种情况,并且由于必须在 LINQ to Entities 之前应用 esql,我该如何完成 sql 排序 + LINQ GroupBy ?
相关:
ObjectQuery 何时真正成为 IOrderedQueryable?
为什么我们不能混合使用 ESQL 和 LINQ TO 实体