2016-02-16 101 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