【问题标题】:Sql Timeout when converting IEnumerable<T> to List<T> in C# Entityframework [closed]在 C# Entityframework 中将 IEnumerable<T> 转换为 List<T> 时的 Sql 超时 [关闭]
【发布时间】:2018-10-09 11:23:51
【问题描述】:

使用以下代码在 2 秒内从数据库中提取了大约 2800 条记录

public IEnumerable<T> ExecWithStoreProcedure(string query, params object[] parameters)
{
        return db.Database.SqlQuery<T>(query, parameters);
}

但是当转换为列表时,Sql Timeout 来了。我正在将 EntityFramework 与 SQL 数据库一起使用。如何在 15 秒内达到性能。

【问题讨论】:

  • 写得不好的查询总是很慢。如果你不能connect 到数据库,你仍然会得到一个超时连接。您发布的内容没有显示任何内容。发布 full 连接,包括调用堆栈(由 Exception.ToString() 返回)。这将显示这是连接超时还是执行超时。同时发布查询本身及其执行计划
  • 不知道为什么调用这个方法需要2秒,你是怎么测出来的?应该几乎立即返回。 SqlQuery 将只返回尚未执行的查询。
  • 我投票决定将此问题作为离题结束,因为无法优化未显示且没有查询计划等必要信息的 sql 查询
  • 拨打db.Database.SqlQuery&lt;T&gt;(query, parameters).First()需要多长时间?

标签: c# sql .net entity-framework ienumerable


【解决方案1】:

Entity Framework 使用惰性求值,这意味着简单地调用SqlQuery 实际上并不执行查询,它只是构建它。只有在实现 IQueryable/IEnumerable 时,才会执行实际查询。所以当你调用 ToList() 时,这就是你的查询被执行的地方。

至于为什么它很慢 - 这取决于查询本身。从这里的代码无法判断。

【讨论】:

  • IQueryable 派生自 IEnumerable。简单地将其返回为 IEnumerable 不一定会执行任何操作。
  • @PanagiotisKanavos 你是说投射一个对象以某种方式运行一个函数。在这种情况下执行查询?
  • @PanagiotisKanavos - 似乎你错过了 OP 的声明 but when converting to list - 所以 .ToList() 调用导致 SQL 异常
  • 相反。调用 ToList() 会执行查询,因此您会得到 SQL 异常。转换为 IEnumerable 不会执行查询,因此没有 SQL 异常。 SQL Exception 与强制转换或 ToList 无关,它只是一个慢查询。
  • 面部护理。坏咖啡
【解决方案2】:

在触发查询命令之前尝试在您的方法中使用它

this.context.CommandTimeout = 180;

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2021-12-02
    • 2010-09-07
    • 1970-01-01
    • 2018-08-04
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多