执行 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 查询时出现超时错误的主要内容,如果未能解决你的问题,请参考以下文章

运行多服务器 SQL Server 查询时出现超时错误

在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时

使用 web3.py 查询远程以太坊节点时出现间歇性“读取超时”错误

Asp.Net 在运行存储过程时出现超时错误

Perl在使用警报超时时出现分段错误

使用 kops 在 gcp 上验证集群时出现 TLS 握手超时错误