繁体   English   中英

实体框架查询超时

[英]Entity Framework Query Timeout

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

    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变量时,查询就会超时。 我不确定为什么会发生这种情况或无法预防。 该值在数据库中不存在,还是只是需要很长时间才能找到它? 这是我收到的错误消息:

EntityFramework.SqlServer.dll中发生类型为'System.Data.Entity.Core.EntityCommandExecutionException'的异常,但未在用户代码中处理

附加信息:执行命令定义时发生错误。 有关详细信息,请参见内部异常。

内部异常:

{“超时到期。在操作完成之前超时时间或服务器没有响应。”}

该值可能不存在,但“超时”仅表示在给定的命令执行时间内没有完成查询。 认为命令的默认超时时间是30秒。

基本问题,但是,如果您的Syslogd表具有许多记录,则MsgHostname上是否有索引?

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

通过使用CommandTimeOut

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

参考

还请考虑以下事项:

  1. 此外,您正在使用.ToList() ,它可以立即强制执行查询,我认为您可以避免这样做以提高性能。
  2. IEnumerable适用于从列表,数组等内存中的集合中查询数据,但不适用于来自内存(如远程数据库,服务)和分页中的数据查询。

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

参考
CodeProject上

可查询的Vs。 IEnumerable在LINQ to SQL查询方面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM