实体框架查询超时

时间:2014-10-29 20:00:48

标签: c# asp.net-mvc linq entity-framework

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

    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但未在用户代码中处理

     

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

内部异常:

  

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

2 个答案:

答案 0 :(得分:3)

值可能不存在,但Timeout只表示查询在执行命令的时间内没有完成。我认为命令的EF默认超时为30秒。

基本问题,但是,如果您的Syslogd表有很多记录,那么MsgHostname上是否有索引?

答案 1 :(得分:1)

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

使用CommandTimeOut

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

Reference

请考虑这一点:

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

    参考
    codeproject

    IQueryable Vs. IEnumerable in terms of LINQ to SQL queries