簡體   English   中英

實體框架查詢超時

[英]Entity Framework Query Timeout

在我的控制器中,我有以下代碼:

    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變量時,查詢就會超時。 我不確定為什么會發生這種情況或無法預防。 該值在數據庫中不存在,還是只是需要很長時間才能找到它? 這是我收到的錯誤消息:

EntityFramework.SqlServer.dll中發生類型為'System.Data.Entity.Core.EntityCommandExecutionException'的異常,但未在用戶代碼中處理

附加信息:執行命令定義時發生錯誤。 有關詳細信息,請參見內部異常。

內部異常:

{“超時到期。在操作完成之前超時時間或服務器沒有響應。”}

該值可能不存在,但“超時”僅表示在給定的命令執行時間內沒有完成查詢。 認為命令的默認超時時間是30秒。

基本問題,但是,如果您的Syslogd表具有許多記錄,則MsgHostname上是否有索引?

正如Ryan所說,命令的默認超時時間是30秒。 因此,您可以增加執行超時時間。

通過使用CommandTimeOut

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

參考

還請考慮以下事項:

  1. 此外,您正在使用.ToList() ,它可以立即強制執行查詢,我認為您可以避免這樣做以提高性能。
  2. IEnumerable適用於從列表,數組等內存中的集合中查詢數據,但不適用於來自內存(如遠程數據庫,服務)和分頁中的數據查詢。

因此,我強烈建議在這種情況下使用IQueryable

參考
CodeProject上

可查詢的Vs。 IEnumerable在LINQ to SQL查詢方面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM