2014-10-29 74 views
0

在我的控制,我有以下代碼:實體框架查詢超時

public ActionResult Syslogs(string IPAddress) { 
     IEnumerable<Syslogd> syslogs = db.Syslogds.Take(100).ToList(); 

     if (!String.IsNullOrEmpty(IPAddress)) { 
      syslogs = db.Syslogds.Where(s => s.MsgHostname == IPAddress).Take(100).ToList(); 
     } 

     return View(syslogs.ToList()); 
    } 

查詢超時每當我通過一定的價值的IPAddress變量。我不知道爲什麼會發生這種情況,或者我可以如何防止這種情況。該值不存在於數據庫中,還是需要很長時間才能找到它?以下是錯誤消息我接收:

類型的異常 「System.Data.Entity.Core.EntityCommandExecutionException」發生在 EntityFramework.SqlServer.dll但在用戶代碼

附加沒有處理信息:執行命令 定義時發生錯誤。詳情請參閱內部例外。

內部異常:

{「超時過期超時時間已過之前的 操作完成或服務器沒有響應。」}

+1

在一個側面說明,你總是執行,即使你是對IP過濾器覆蓋這些值的第一個查詢。您應該將第一個查詢移至else子句以避免做任何額外的不必要的工作。 – 2014-10-29 20:05:35

+0

Syslogd有多少條記錄?數據庫是否在單獨的機器上?什麼是網絡帶寬使用? – 2014-10-29 22:02:20

回答

3

這有可能是該值不存在,但超時僅表示查詢在給定的執行時間內沒有完成。 I 認爲 EF的缺省超時時間爲30秒。

基本問題,但是,如果您的Syslogd表有很多記錄,那麼MsgHostname上是否有索引?

+0

我發現該記錄在數據庫中不存在。我想現在我的問題是如何在執行查詢之前檢查該問題?我試過db.Syslogd.Any(),但沒有奏效。 – mdk09 2014-10-30 16:19:14

1

正如Ryan所說,EF的默認超時時間爲30秒。所以你可以增加執行超時時間。

通過使用CommandTimeOut

// Specify a timeout for queries in this context, in seconds. 
context.CommandTimeout = 120; 

Reference

想想也是這樣:

  1. 而且使用的是.ToList()這是力查詢執行由 直接和我想你可以避免改善性能。
  2. IEnumerable適合從List,Array等內存集合中查詢數據。但不適合從外存(如遠程數據庫,服務)集合和分頁查詢數據。

所以我強烈建議在這種情況下使用IQueryable

參考
codeproject

IQueryable Vs. IEnumerable in terms of LINQ to SQL queries