实体框架查询需要很长时间,超时异常

时间:2014-05-12 08:07:51

标签: c# entity-framework

如果我测试从TableName中选择*,其中Id = 257 ,那么我会在几秒钟内获得一条记录和查询,但是当从TableName中选择* 时,它会显示千条记录,执行时间超过3分钟。

我在实体框架中使用此语句,我总是得到超时异常:

TableName tbl= db.TableName.Where(o => o.ID == 257).FirstOrDefault();

它是否首先从db中选择所有记录然后应用于其中的位置,这就是为什么它需要花费很多时间或者还有其他原因?

请指导我。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用类似

的内容
var query = db.TableName.Where(x => x.ID == 257);
Console.WriteLine(query.ToString());    

查看EF生成的sql。

当你说

Select * from TableName then it shows thousand of records and it takes more than 3 minutes     to execute.

这是预期的行为,因为没有条件。

但是你的EF查询并没有反映出来。

并且有where子句。如果您的表是ID的索引,只需进行疯狂的猜测 你也可以尝试使用

TableName tbl= db.TableName.Find(257);

while会执行得更快,因为它可以从缓存中返回结果。

更新的 您还可以使用名为" Entity Framework Profiler"

的sql分析工具

http://www.hibernatingrhinos.com/products/efprof

我个人使用它的非常好的工具。

答案 1 :(得分:0)

  1. 通常只要您在Linq查询中对IQueryable集合进行操作,该操作就会构建SQL语句,而不会查询数据库。它查询数据库并最终实现集合,如果您使用以下操作:ToList(),FirstOrDefault()或您只是开始迭代集合。

    因此,使用IQueryable集合(而不是List)构建Linq语句总是更好。因此,在这种情况下,当您使用Linq扩展方法(流畅模式模式)时,Where总是返回IQueryable集合。

  2. 如果您花费时间来收集行,并且您不打算对其进行更改(仅读取),则可以在将数据保存到数据库期间关闭ChangeTracking功能以及验证:

    db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false;

  3. 在某些情况下,它会带来很大的性能提升。