执行 LINQ 查询时出现超时错误

本文关键字:超时 错误 LINQ 查询 执行 | 更新日期: 2023-09-27 18:34:54

 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 并执行,但在执行 count 语句时仍然看到超时错误。谁能帮忙找到原因?

执行 LINQ 查询时出现超时错误

您的表太小而无法导致实际超时,因此,这很可能是仅在操作超时时才会中断的死锁。

由于代码中的 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 请求完成。