2011-09-28 43 views
2

這是我的代碼。簡化了可讀性當我在枚舉結果之前得到Count()時,爲什麼會得到「查詢的結果不能多​​次枚舉」?

var query = from p in people select p; 

// here is the point that probably causes the issue 
ObjectResult<int> idsThatMatch = getIdsThatMatchFullTextSearch("andre"); 
query = from p in query where idsThatMatch.Contains(p.id) select p; 

var count = query.Count(); 
query = query.OrderBy(p => p.id); 
var pessoas = query.Skip(90).Take(30).ToList(); 

我需要跳過前閱讀計數/採取尋呼之前得到的記錄總量。計數工作正常。但是在我摘錄的最後一行就觸發查詢的除外

結果不能枚舉不止一次

爲什麼?伯爵不應該列舉任何事情。我該如何解決這個問題?謝謝

編輯

人們認爲我是用存儲過程,但我不是。其實我正在使用「select in」。代碼在評論中低吼。

編輯2

我只是測試上面的代碼沒有 「選擇」 的一部分,它工作正常

EDIT 3

使用該線的工作原理:

ObjectResult<int> idsThatMatch = (getIdsThatMatchFullTextSearch("andre"); 
query = from p in query where idsThatMatch.Contains(p.id) select p).ToArray(); 

謝謝

回答

4

的問題是這一行:

ObjectResult<int> idsThatMatch = getIdsThatMatchFullTextSearch("andre"); 

這將返回ObjectResultObjectQueryIQueryable。結果只能迭代一次。一旦你用Count執行你的第一個查詢,你不能再使用結果了,你的第二個查詢執行將失敗,因爲它會嘗試再次迭代結果。

ObjectResult不在數據庫端處理 - 它是執行ObjectQuery的結果,一次執行只能有一個枚舉結果集。這就像遊標遍歷應用程序中的結果集一樣。

+0

我修改了它(編輯3),以便在我的下一個操作之前將idsThatMatch的結果緩存到數組中。非常感謝你。 (你已經幫了我很多次了) –

1

您的人員可能來自實體框架模型中映射的存儲過程。 在這種情況下,您無法對其執行過濾或跳過操作,因爲結果已經過評估。

The result of a query cannot be enumerated more than once

The query results cannot be enumerated more than once?

+0

否否..不存在涉及的存儲過程。我之前看過這些鏈接。他們沒有幫助=//無論如何謝謝 –

+1

@AndréPena人不能掛在空中。請分享人們來自哪裏?實際的查詢真的是什麼樣子。 –

+0

我會分享它..只是片刻 –