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并执行但在执行计数统计时仍然看到超时错误。任何人都可以帮忙找到原因吗?
答案 0 :(得分:1)
您的表太小而不会导致实际超时,因此,这很可能是仅在操作超时时才会中断的死锁。
由于代码中的LINQ查询会创建IQueryable&lt;&gt;对象(就像可以在需要时运行的待处理查询一样),.Count()可能在查询实际运行之前被调用,虽然我不确定为什么会这样。
通过在查询中添加.ToList()来强制查询运行来测试 (关于IEnumerable&lt;&gt; .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请求完成。