Entity framework 4 实体SQL排序然后LINQ到实体GroupBy不';t返回IOrderedQueryable

Entity framework 4 实体SQL排序然后LINQ到实体GroupBy不';t返回IOrderedQueryable,entity-framework-4,linq-to-entities,query-builder,entity-sql,Entity Framework 4,Linq To Entities,Query Builder,Entity Sql,有效:我的UI将排序表达式从jqGrid发送到我的DAL,然后应用一些返回到我的服务层的Where子句。然后,我的服务层将创建一个PaginatedList对象,该对象将Skip()…Take()应用于IQueryable。 例如: var qry = ((IObjectContextAdapter)DbContext).ObjectContext .CreateQuery<TEntity>(entityName) .OrderBy(pEntitySQLSort.GetEntityS

有效:我的UI将排序表达式从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);
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.
var qry=((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL());
//GetEntitySQL()即“it.WorksheetID ASC”
返回qry.Where(p=>pStatus==“blah”)。跳过(5)。取(10);
不起作用:应用GroupBy()然后选择()返回相同类型实体(工作表)的列表。 例如:

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);
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.
var qry=((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL());
var qrygroup=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));
返回qrygroup.Skip(5)、Take(10)//抛出异常。
抛出NotSupportedException:方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用。

在我看来,第一个代码段确实返回了应用esql排序表达式的IOrderedQueryable,但第二个代码段没有?或者GroupBy()是否删除了查询/集合的顺序?如果是这种情况,并且由于必须在LINQ应用于实体之前应用esql,我如何才能完成sql排序+LINQGroupBy

相关:

GroupBy()
返回一个
i分组
。实际对象是作为
IQueryable
返回的
ObjectQuery
。您已链接到我的问题(ObjectQuery何时真的是IOrderedQueryable?),因此您知道,此
ObjectQuery
也实现了
IOrderedQueryable
并不一定意味着它实际上就是这样的

在a中,Jon Skeet区分了实际类型和编译时类型。编译时类型(
IQueryable
)才是关键

因此,
GroupBy
有效地取消了先前的
OrderBy
。在一个类似案例的快速测试中,我可以看到分组中甚至没有排序。结论:您必须重新应用一个
OrderBy
,才能成功执行
Skip

GroupBy()
返回一个
IGrouping
。实际对象是作为
IQueryable
返回的
ObjectQuery
。您已链接到我的问题(ObjectQuery何时真的是IOrderedQueryable?),因此您知道,此
ObjectQuery
也实现了
IOrderedQueryable
并不一定意味着它实际上就是这样的

在a中,Jon Skeet区分了实际类型和编译时类型。编译时类型(
IQueryable
)才是关键


因此,
GroupBy
有效地取消了先前的
OrderBy
。在一个类似案例的快速测试中,我可以看到分组中甚至没有排序。结论:您必须重新应用
OrderBy
,才能成功执行
Skip

谢谢!但这意味着它不能使用esql来完成,因为根据迭戈·维加(Diego Vega)的说法,它必须发生在任何linq到实体之前。。正确吗?我认为您应该能够在示例中执行
qrygroup.OrderBy()
。是的,我能够执行OrderBy()linq实体,但不能使用实体查询生成器。查询生成器的方法应该是.OrderBy(“it.WorksheetID DESC”),但它只能从ObjectQuery中使用,并且一旦它可以使用linq2entities进行IQueryable,就不能回溯到ObjectQuery来使用此方法。我不想接受我唯一的选择是在实体sql中编写整个查询,包括GROUPBY子句。。。但我认为这是底线-\恐怕是的。但是你可以使用限制和跳过,不是吗?在OrderBy(esql)之后,也就是说。起初我以为可以,但后来我想,在分组之前应用分页没有多大意义。然后我会限制分组的结果集,这将返回不完整的结果。谢谢!但这意味着它不能使用esql来完成,因为根据迭戈·维加(Diego Vega)的说法,它必须发生在任何linq到实体之前。。正确吗?我认为您应该能够在示例中执行
qrygroup.OrderBy()
。是的,我能够执行OrderBy()linq实体,但不能使用实体查询生成器。查询生成器的方法应该是.OrderBy(“it.WorksheetID DESC”),但它只能从ObjectQuery中使用,并且一旦它可以使用linq2entities进行IQueryable,就不能回溯到ObjectQuery来使用此方法。我不想接受我唯一的选择是在实体sql中编写整个查询,包括GROUPBY子句。。。但我认为这是底线-\恐怕是的。但是你可以使用限制和跳过,不是吗?在OrderBy(esql)之后,也就是说。起初我以为可以,但后来我想,在group by之前应用分页没有多大意义。然后,我将限制分组的结果集,这将返回不完整的结果。。