web-dev-qa-db-ja.com

クエリの結果を複数回列挙することはできません

エンティティフレームワーク(ef)を使用していますが、次のエラーが表示されます。

「クエリの結果を複数回列挙することはできません。」.

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ループに入ることができますが、次のエラーが表示されます。

タイプ 'System.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の何かのために反復できないと感じています。

66
Halcyon

ToList()を呼び出して、結果を明示的に列挙してみてください。

変化する

foreach (var item in query)

foreach (var item in query.ToList())
137
Yakimych

これを交換してみてください

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

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

そして、すべてがうまく機能します。

7
hosam hemaily