2011-04-19 21 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); 

将工作做好。

相关问题