2013-06-26 43 views
0

我需要從IQueryable創建一個IEnummerable的DcumentSearch對象 以下代碼會導致數據庫加載使我的應用程序變慢的整個結果。裝飾IEnumerable而不循環

public static IEnumerable<DocumentSearch> BuildDocumentSearch(IQueryable<Document> documents) 
{ 
    var enumerator = documents.GetEnumerator(); 
    while(enumerator.MoveNext()) 
    { 
     yield return new DocumentSearch(enumerator.Current); 
    }  
} 
+3

您正在枚舉所有文檔並且不希望加載所有文檔?在這種情況下你會列舉什麼? –

+0

使用IEnumerable時應該修飾它 – Aphelion

+1

您顯示的代碼不應該加載數據庫中的數據。只有在枚舉該方法的結果時,才能加載數據。這是正確的,因爲否則你就沒有什麼可迭代的。 –

回答

1

寫這個的自然的方式是:

public static IEnumerable<DocumentSearch> BuildDocumentSearch(IQueryable<Document> documents) 
{ 
    return documents.Select(doc => new DocumentSearch(doc)); 
} 

當你調用的IEnumerable的擴展方法,如選擇,其中,排序依據等,你仍然增加了幾招結果一個將被退回。當您嘗試訪問IEnumerable的元素(如您的示例中所示)時,必須在此時解析結果集。

對於什麼是值得的,while循環會更自然地寫成foreach循環,儘管它應該具有與執行查詢時相同的語義。

+0

創建IEnumerable時,這段代碼不會觸發數據庫。這是我正在尋找的。 UI網格使用該結果一次加載幾行,從而獲得更快的頁面。謝謝! – chadisbad