首页>Program>source

我正在使用实体框架(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 调用存储的过程以返回 SearchItem的集合

我感觉到由于ef的原因,foreach循环无法迭代。

最新回答
  • 2021-1-11
    1 #

    尝试通过调用 ToList()明确枚举结果

    更改

    foreach (var item in query)
    

    foreach (var item in query.ToList())
    

  • 2021-1-11
    2 #

    尝试替换此

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

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

    一切都会正常工作。

  • 2021-1-11
    3 #

    如果您遇到这种类型的错误,那么我建议您习惯将proc数据存储为常规列表,然后绑定其他控件,因为我也遇到了此错误,因此我解决了 像这样 例如:-

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

    尝试这样

  • javascript:没有jquery的jquery的"触发"方法等效于什么?
  • 使用cron安排R脚本