2016-02-16 74 views
0
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(); 

大家好。当我遇到这个问题时第一次登录。执行linq查询时的超时错误

执行我的C#控制器代码的上述行时,我得到超时表达式。在查看以前的建议后,我尝试了查询IQueryable并执行,但仍然在执行计数统计时看到超时错误。任何人都可以帮助找到原因吗?

+0

可能您可以尝试增加DataContext中的超时时间。我假设_ctx是你的DataContext。 – Rangesh

+1

您是否试图查看正在生成的SQL并针对您的SQL服务器运行该查询以查看查询本身是否有问题?这可能是你需要添加一些索引到你的表中。 –

+0

MailHeaders数据库表中有多少条记录?而且,这是一张普通的桌子,一个视图还是其他的东西?这将有助于确定超时是否真的是超时,或者可能是其他情况(例如死锁或数据库视图分页问题等)。 –

回答

0

您的表太小而不会导致实际超时,因此,这很可能是一个只在操作超时时才会被破坏的死锁。由于您的代码中的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请求完成。

+0

非常感谢你的解决方案。 – Aishwarya

+0

将代码置于其他表操作的开始之后,代码可以正常工作 – Aishwarya