2012-10-01 84 views
0

時打破一個循環我有以下代碼:當用戶點擊,而這個過程正在運行一個取消按鈕列舉一個IQueryable

var docs = ctx.Documents.Select(a => 
    new { a.ID, Content = a.Document, a.LastModified, CreatedDate = a.Created }); 

foreach (var doc in docs) 
{ 
    if (Utility.ContinueDocumentPreview) 
    { 
     _createFile(doc.ID, doc.Content, doc.CreatedDate, doc.LastModified); 
     _fireProgress(++counter, count); 
    } 
    else 
    { 
     break; 
    } 
} 

的Utility.ContinueDocumentPreview標誌被設置爲false。問題是當標誌爲false並且代碼應該跳出循環時,我得到一個SQL超時異常。

我這樣做不正確嗎?

+0

根據你提供的代碼判斷,我會說你的問題與循環無關。你檢查了堆棧跟蹤以確認這與你的循環有關嗎? – Jeremy

+0

當你不取消一切運行好嗎?什麼大小可以'doc.Content'是? –

回答

0

可能使用.ToList到循環之前執行的SQL ,但它種取決於有多少數據你從你的數據庫中獲取英寸這可能會導致一個大的SQL查詢一次,所以測試了很多,以確保你得到你喜歡的性能。

// You can add .ToList() here: 
var docs = ctx.Documents.Select(a => new { a.ID, Content = a.Document, a.LastModified, CreatedDate = a.Created }).ToList(); 

// Or, you can add .ToList() here: 
foreach (var doc in docs.ToList()) 
{ 
    if (Utility.ContinueDocumentPreview) 
    { 
     _createFile(doc.ID, doc.Content, doc.CreatedDate, doc.LastModified); 
     _fireProgress(++counter, count); 
    } 
    else 
    { 
     break; 
    } 
}