2013-03-30 180 views
2

我們有一個視圖,它首先使用EF代碼調用。它使用Linq語法,並且很簡單。工作一段時間後,查詢超時ToList方法。即使在那個時候,查詢也可以從SSMS立即開始。實體框架代碼第一個ToList方法在SQL Azure上超時

注意到的一件事是丟棄並重新創建視圖解決了該問題,但在無限期後問題重新出現。

該數據庫位於SQL Azure上,並檢查該對象上的任何鎖定,但未找到任何鎖定。

有沒有人遇到過這樣的問題或類似問題。能否請你幫忙???

這被封鎖

var results = facilityId == Guid.Empty ? 
          (from c in Context.CallLists 
          where c.AgencyId == agencyId 
          select c) 
           : 
          (from c in Context.CallLists 
          where c.AgencyId == agencyId && c.InitiatedFacilityId == facilityId 
          select c); 

if (request.Page > 0) 
      { 
       results = results.Skip((request.Page - 1) * request.PageSize); 
      } 

     return results.Take(request.PageSize); 
+0

查詢是否每次都超時或間歇性?它從數據庫中檢索多少數據? – greg84

+0

這個「鎖定」是間歇性的。數據庫只有30,000行,並且一次只有25個顯示在UI上。但是一旦發生「鎖定」,所有的EF查詢都會超時。 – anil

+0

你可以在你的問題中包含LINQ查詢嗎? – greg84

回答

0

把它變成一個IOrderedQueryable<T>通過SkipTake之前調用.OrderBy()的實際查詢。我認爲它正在檢索表中的所有行。通常我會期待an exception to be thrown,但我不知道爲什麼它不是 - 你在使用結果嗎?你有沒有試過用頁面> 0運行它?

試試這個:

var results; 

if (facilityId != Guid.Empty) 
{ 
    results = Context.CallLists.Where(c => c.AgencyId == agencyId).OrderBy(c => c.Something); 
} 
else 
{ 
    results = Context.CallLists.Where(c => c.AgencyId == agencyId && c.InitiatedFacilityId == facilityId).OrderBy(c => c.Something); 
} 

if (request.Page > 0) 
{ 
    results = results.Skip((request.Page - 1) * request.PageSize); 
} 

return results.Take(request.PageSize); 

除了這個,你需要拿出處理SQL Azure的瞬態錯誤的方法。這基本上是在SQL Azure中執行查詢時可能拋出的錯誤的一個子集,應該通過等待並重試操作來處理,通常會在重試之間增加等待時間,直到您最終接受失敗爲止。詳細瞭解它herehere

+0

格雷格,有一個命令,我錯過了複製,因爲這是有條件地在多行代碼中完成的。所以這似乎不是問題。但是,感謝您提供瞬態故障處理。這絕對需要完成!但目前的問題似乎並不是因爲這個。 – anil

+0

什麼是在數據庫上執行的查詢?你可以在查詢中調用'.ToString()'並查看它實際運行的是什麼?我所能想到的是,它出於某種原因正在查詢所有行。 – greg84

相關問題