2011-04-19 23 views
55

我現在用的是實體框架(EF)和正在以下錯誤列舉:查詢的結果不能超過一次

"The result of a query cannot be enumerated more than once.".

我有一個包含EF數據上下文的存儲庫類。然後我有一個控制器類(不要與MVC控制器混淆),它包含存儲庫的一個實例。到目前爲止這麼好...我有一個控制器上的搜索方法,它應該返回一個數組RadComboBoxItemData,用於填充Telerik RadComboBox控件。

public RadComboBoxItemData[] Search(int id, string searchText) 
{ 
    var query = context.Search(id, searchText); 
    List<RadComboBoxItemData> result = new List<RadComboBoxItemData>(); 
    foreach (var item in query) 
    { 
     RadComboBoxItemData itemData = new RadComboBoxItemData(); 
     itemData.Text = ""; // assign some text here..; 
     itemData.Value = ""; /*assign some value here..*/ 
     result.Add(itemData); 
    } 

    return result.ToArray(); 
} 

當我調試我的代碼,我可以進入foreach循環,但後來我得到一個錯誤說:

An exception of type 'System.InvalidOperationException' occurred in System.Data.Entity.dll but was not handled in user code

Additional information: The result of a query cannot be enumerated more than once.

我的實體使用現有的存儲過程的函數導入。

// EF repository method calling the function imported method on the data context. 
public IEnumerable<SearchItem> Search(int id, string searchText) 
{ 
    return this.entityContext.Search(id, searchText); 
} 

功能導入Search調用存儲precedure返回的SearchItem的集合。

我有一種感覺,foreach循環無法迭代,因爲與ef的東西。

+3

你錯過了一個.ToList(),我只是看不到在哪裏...我會抓一杯咖啡,再看一看 – Smudge202 2011-04-19 22:45:24

回答

116

嘗試通過調用ToList()明確列舉結果。

變化

foreach (var item in query) 

foreach (var item in query.ToList()) 
+3

工作!你能解釋它爲什麼有效嗎? – Halcyon 2011-04-19 22:52:35

+2

@Halcyon它工作原理是因爲使用'ToList',你正在從列表中的數據庫檢索所有結果,從現在起linq方法不會在數據庫上工作。這可能是一個嚴重的性能問題,具體取決於您擁有的數據量以及您將使用的數據量。 – BrunoLM 2011-07-21 20:24:37

+2

@BrunoLM - 在這種情況下,OP已經遍歷所有查詢結果。如果需要對數據庫執行更多的「linq方法」,他可以繼續使用「query」變量。我不但沒有看到解決方案的問題,而且也是解決OP問題的最佳方法。謹慎解釋downvote? – Yakimych 2011-07-22 08:01:14

-5

,如果你這樣,我建議你用存儲過程數據和往常一樣名單,然後結合其他控件,因爲我也得到這個錯誤讓這種類型的錯誤所以我就這樣解決了這個問題 ex: -

repeater.DataSource = data.SPBinsReport().Tolist(); 
repeater.DataBind(); 

試一下這個

3

嘗試

var query = context.Search(id, searchText).tolist(); 

,一切更換此

var query = context.Search(id, searchText); 

將工作做好。

相關問題