作品:我的用户界面发送entity sql排序表达式从jqGrid到我的DAL,然后应用一些Where子句返回到我的服务层。然后,我的服务层将创建一个PaginatedList对象,将Skip().. Take()应用于IQueryable。 例子:实体SQL排序然后LINQ to实体GroupBy不返回IOrderedQueryable
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(),然后选择()返回同一类型的实体(作业)的列表。 实施例:
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到实体排序输入。方法'OrderBy'必须在方法'Skip'之前调用。
在我看来,第一个片段确实会返回一个应用esql排序表达式的IOrderedQueryable,但第二个片段不会呢?或者GroupBy()可能会删除查询/集合的排序?如果情况确实如此,并且由于esql必须在LINQ to Entities之前应用,我怎么才能完成sql排序+ LINQ GroupBy?
相关:
When is ObjectQuery really an IOrderedQueryable?
Why can't we mix ESQL and LINQ TO Entities
谢谢!但这意味着它不能使用esql完成,因为它必须发生在根据迭戈维加的实体之前的任何linq ..正确吗? – diegohb 2012-03-12 21:44:26
我想你应该可以在你的例子中使用'qryGrouped.OrderBy()'。 – 2012-03-12 21:56:40
是的,我可以做OrderBy()linq实体,但不能与实体查询生成器。查询生成器的方法是.OrderBy(“it.WorksheetID DESC”),但它只能从ObjectQuery获得,一旦它变成带有linq2entities的IQueryable,你不能转回ObjectQuery来使用这种方法。我不想接受,我唯一的选择是将整个查询写入实体sql中,包括group by子句...但我认为这是底线..: - \ – diegohb 2012-03-12 22:11:07