entity frameworkSkip方法运行速度很慢

我在我的数据访问层使用Entity Framework 5,ObjectContext和POCO。 我有一个通用的存储库实现,我有一个方法,使用Skip()和Take()通过分页查询数据库。 一切正常,但跳过很多行时查询性能非常慢(我说的是170k行)

这是我对Linq to Entities的查询的摘录:

C#代码:

ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection); var idPred = oc.CreateObjectSet("view_Trans").AsQueryable(); idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc")); var result = idPred.Skip(iDisplayStart).Take(iDisplayLength); return new PagedResult(result, totalRecords); 

在对Transact-SQL的翻译查询中,我注意到,不是直接使用视图的ROW_NUMBER()子句进行子查询,而是将ROW_NUMBER()应用于子查询的结果…

例:

 select top(10) extent1.A, extent1.B.extent1.C from ( select extent1.A, extent1.B, extent1.C, row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number] from ( select A,B,C from table as extent1)) as extent1 WHERE [Extent1].[row_number] > 176610 ORDER BY [Extent1].[A] DESC 

这需要大约165秒才能完成。 有关如何提高翻译查询语句性能的任何想法?

对于那些没有遵循上述评论的人,我怀疑问题不是额外的SELECT ,因为额外的SELECT存在于许多EF查询中,这些查询不需要运行165s。 我最终注意到他的ObjectSet引用了一个VIEW并想知道这是否可能是问题的一部分。 经过一些实验,他将问题缩小到视图内的LEFT JOIN 。 我建议他在该查询上运行Database Tuning Advisor; 他做了,两个指数建议解决问题。

缓慢的一个原因可能是你的sql两次排序你的行。

为了控制查询,我所知道的唯一选择是调用idPred.SqlQuery(“Select …”,params)。 这将允许您为数据请求编写自己的优化查询。