实体框架查询超时
本文关键字:超时 查询 框架 实体 | 更新日期: 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;
同时考虑这一点:
- 此外,您正在使用强制立即执行查询的
.ToList()
,我认为您可以避免这种情况以提高性能 IEnumerable
适用于查询List、Array等内存内集合中的数据,但不适用于查询内存外(如远程数据库、服务)集合和分页中的数据
因此,我强烈建议在这种情况下使用IQueryable
。
参考
代码项目
IQueryable与IEnumerable在LINQ到SQL查询方面的比较