在我的控制器中,我有以下代码:
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但未在用户代码中处理
附加信息:执行命令时发生错误 定义。有关详细信息,请参阅内部异常。
内部异常:
{“超时已到期。超时时间在完成之前已经过去 操作或服务器没有响应。“}
答案 0 :(得分:3)
值可能不存在,但Timeout只表示查询在执行命令的时间内没有完成。我认为命令的EF默认超时为30秒。
基本问题,但是,如果您的Syslogd表有很多记录,那么MsgHostname上是否有索引?
答案 1 :(得分:1)
正如Ryan所说,对于命令,EF的默认超时为30秒。因此,您可以增加执行超时时间。
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;
请考虑这一点:
.ToList()
执行强制查询
立即,我认为你可以避免这样做,以提高性能。 IEnumerable
适用于查询内存集合(如List,Array等)中的数据。但不适合查询来自内存(如远程数据库,服务)集合和分页的数据。 所以我强烈建议在这种情况下使用IQueryable
。
参考
codeproject