实体框架查询超时

本文关键字:超时 查询 框架 实体 | 更新日期: 2023-09-27 18:28:16

在我的控制器中,我有以下代码:

    public ActionResult Syslogs(string IPAddress) {
        IEnumerable<Syslogd> syslogs = db.Syslogds.Take(100).ToList();
        if (!String.IsNullOrEmpty(IPAddress)) {
            syslogs = db.Syslogds.Where(s => s.MsgHostname == IPAddress).Take(100).ToList();
        }
        return View(syslogs.ToList());
    }

每当我将某个值传递给IPAddress变量时,查询就会超时。我不知道为什么会发生这种情况,也不知道如何防止。数据库中是否不存在该值,或者只是需要很长时间才能找到它?这是我收到的错误消息:

类型的异常中出现"System.Data.Entity.Core.EntityCommandExecutionException"EntityFramework.SqlServer.dll,但未在用户代码中处理

附加信息:执行命令时出错释义有关详细信息,请参阅内部异常。

内部异常:

{"超时已过期操作或服务器没有响应。"}

实体框架查询超时

这个值可能不存在,但Timeout只是意味着查询没有在给定的命令执行时间内完成。我认为命令的EF默认超时为30秒。

基本问题,但是,如果你的Syslogd表有很多记录,MsgHostname上有索引吗?

正如Ryan所说,EF命令的默认超时为30秒。因此,您可以增加执行超时时间。

使用CommandTimeOut:

    // Specify a timeout for queries in this context, in seconds.
    context.CommandTimeout = 120;

参考

或者使用Database.CommandTimeout

// or for all object in context (in seconds)
context.Database.CommandTimeout = 120;

同时考虑这一点:

  1. 此外,您正在使用强制立即执行查询的.ToList(),我认为您可以避免这种情况以提高性能
  2. IEnumerable适用于查询List、Array等内存内集合中的数据,但不适用于查询内存外(如远程数据库、服务)集合和分页中的数据

因此,我强烈建议在这种情况下使用IQueryable

参考
代码项目

IQueryable与IEnumerable在LINQ到SQL查询方面的比较