【发布时间】:2012-03-12 15:37:47
【问题描述】:
工作:我的 UI 将 jqGrid 中的 entity sql 排序表达式发送到我的 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:“Skip”方法仅支持 LINQ to Entities 中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用。
在我看来,第一个 sn-p 确实返回了一个应用 esql 排序表达式的 IOrderedQueryable,但第二个 sn-p 没有?或者 GroupBy() 是否删除了查询/集合的顺序?如果是这种情况,并且由于必须在 LINQ to Entities 之前应用 esql,我该如何完成 sql 排序 + LINQ GroupBy ?
相关:
When is ObjectQuery really an IOrderedQueryable?
Why can't we mix ESQL and LINQ TO Entities
【问题讨论】:
标签: entity-framework-4 linq-to-entities query-builder entity-sql