Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架跳过方法运行非常慢_C#_Entity Framework_Entity Framework 5_Poco - Fatal编程技术网

C# 实体框架跳过方法运行非常慢

C# 实体框架跳过方法运行非常慢,c#,entity-framework,entity-framework-5,poco,C#,Entity Framework,Entity Framework 5,Poco,我正在数据访问层上使用EntityFramework5、ObjectContext和POCO。我有一个通用的respository实现,还有一个使用Skip()和Take()通过分页查询数据库的方法。除了跳过很多行(我说的是170k行)时查询性能非常慢之外,其他一切都正常工作 这是我对Linq to实体查询的摘录: C#代码: ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection); var id

我正在数据访问层上使用EntityFramework5、ObjectContext和POCO。我有一个通用的respository实现,还有一个使用Skip()和Take()通过分页查询数据库的方法。除了跳过很多行(我说的是170k行)时查询性能非常慢之外,其他一切都正常工作

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

C#代码:

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

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

速度缓慢的一个原因可能是sql对行进行了两次排序


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

对于那些不遵循上述注释的人,我怀疑问题不是额外的
SELECT
,因为额外的
SELECT
存在于许多不需要165s运行的EF查询中。我最终注意到他的ObjectSet引用了一个
视图
,并怀疑这是否是问题的一部分。经过一些实验,他将问题缩小到视图中的
左连接。我建议他在这个查询上运行数据库调优顾问;他这样做了,两个索引建议解决了这个问题。

由于查询速度快,没有跳过,这表明问题出在SQL中,而不是实体框架中的其他性能方面。因此,我要做的第一件事是使用SQL Profiler来诊断查询速度慢的原因。你试过这个吗?你发现了什么?我已经找到了。我认为问题在于实体框架正在构建的不必要的子查询,当我使用LinqToSql而不是实体框架进行相同的查询时,结果是不一样的,查询速度要快得多(~30秒)。如果您在上面的示例中看到Sql,那么表中有一个不必要的子查询,行号不会应用于表,而是应用于该子查询的结果。我添加了一个行号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