查询的结果不能被枚举多次

本文关键字:枚举 不能 结果 查询 | 更新日期: 2023-09-27 17:50:31

我正在使用实体框架(ef),并得到以下错误:

"查询的结果不能枚举多次".

我有一个包含ef data上下文的存储库类。然后,我有一个包含存储库实例的控制器类(不要与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循环,但然后我得到一个错误说:

类型的异常的系统。InvalidOperationException"发生在System.Data.Entity.dll中,但是未在用户代码

中处理

附加信息:结果查询不能枚举多个一次。

我的实体使用现有存储过程的函数导入。

// 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);
}

import Search调用一个存储过程返回SearchItem的集合。

我有一种感觉,foreach循环不能迭代,因为ef。

查询的结果不能被枚举多次

尝试通过调用ToList()显式枚举结果。

改变
foreach (var item in query)

foreach (var item in query.ToList())

尝试替换

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

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

一切都会顺利的。

调用存储过程的代码有问题:

var resultSP = db.StoredProcedure(id);
if (resultSP != null)
{
    var count = resultSP.Count();
    
    var list = resultSP.Select(x=>...);
}

修复,使用ToList()存储在变量中并重用:

var resultSP = db.StoredProcedure(id);
if (resultSP != null)
{
    var resultSP_List = resultSP.ToList();
    
    var count = resultSP_List.Count();
    
    var list = resultSP_List.Select(x=>...);
}

如果你得到这种类型的错误,所以我建议你习惯存储过程数据像往常一样列表,然后绑定其他控件,因为我也得到这个错误,所以我解决它像这样例:-

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