执行 linq 查询时出现超时错误
Posted
技术标签:
【中文标题】执行 linq 查询时出现超时错误【英文标题】:timeout error in executing a linq query 【发布时间】:2016-02-16 16:58:21 【问题描述】: IQueryable<MailHeader> mailHeader =
_ctx.MailHeaders.Where(w => (w.ToReceipientID.Contains(curUser)
|| w.CCReceipientID.Contains(curUser)
|| w.BCCReceipientID.Contains(curUser))
&& w.UnRead == true && w.IsDraft == false
&& w.IsInbox == true
&& (w.IsApproved == true || w.IsApproved == null));
int unReadMails = mailHeader.Count();
大家好。首次登录时遇到此问题。
在执行上述 C# 控制器代码行时,我遇到了超时表达式。在查看了以前的建议后,我尝试使查询 IQueryable 并执行,但在执行计数语句时仍然看到超时错误。谁能帮忙找出原因?
【问题讨论】:
可能你可以尝试增加DataContext中的超时时间。我假设 _ctx 是你的 DataContext。 您是否尝试过查看正在生成的 SQL 并针对您的 SQL 服务器运行它以查看查询本身是否有问题?可能是您需要向表中添加一些索引。 MailHeaders 数据库表中有多少条记录?而且,那是一张普通的桌子,还是一个视图,还是别的什么?这将有助于确定超时是否真的超时,或者可能是其他原因(例如死锁或数据库视图分页问题等)。 @RyanTernier 该查询在 SQL Server 中运行良好,几乎不需要一秒钟就可以给我结果。 @MattJordan 这是一张普通的桌子。 Mailheader 有大约 300 行。 【参考方案1】:您的表太小而不会导致真正的超时,因此,这很可能是一个死锁,只有在操作超时时才会被打破。
由于代码中的 LINQ 查询创建了一个 IQueryable 对象(如可能在需要时运行的挂起查询),因此 .Count() 可能在查询实际运行之前被调用,尽管我不知道为什么应该是这样的。
通过将 .ToList() 添加到您的查询以强制查询运行来测试这一点 (关于 IEnumerable.ToList() 的文档在这里:https://msdn.microsoft.com/en-us/library/bb342261(v=vs.110).aspx):
IEnumerable<MailHeader> mailHeader =
_ctx.MailHeaders.Where(w => (w.ToReceipientID.Contains(curUser)
|| w.CCReceipientID.Contains(curUser)
|| w.BCCReceipientID.Contains(curUser))
&& w.UnRead == true && w.IsDraft == false
&& w.IsInbox == true
&& (w.IsApproved == true || w.IsApproved == null)).ToList();
int unReadMails = mailHeader.Count();
如果这没有超时,那么原因是 .Count() 和实际查询之间的死锁。如果这仍然超时,则其他原因正在锁定表并阻止 LINQ 请求完成。
【讨论】:
将代码放在方法的开头后代码运行良好,该方法高于在同一方法中完成的其他表操作以上是关于执行 linq 查询时出现超时错误的主要内容,如果未能解决你的问题,请参考以下文章
在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时