63

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

msgstr "問い合わせの結果を複数回列挙することはできません。"

私は、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);
}

関数インポートSearchのコレクションを返すためにストアドプロシージャを呼び出します。SearchItem

私は、foreachループがefのあるもののために繰り返すことができないような気がします。


  • あなたは.ToList()を見逃しています、私はただどこにいるか見ることができません...私はコーヒーをつかんで、もう一度見てみることができます - Smudge202

3 답변


126

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

変化する

foreach (var item in query)

foreach (var item in query.ToList())


  • それはうまくいった!それが機能する理由を説明できますか。 - Halcyon
  • @Halcyonを使っているのでうまくいきますToListこのリストのデータベースからすべての結果を取得しようとしていますが、これからはlinqメソッドでデータベースを処理することはできません。あなたが持っているデータの量とあなたがそれをどうするかによっては、これは深刻なパフォーマンスの問題になる可能性があります。 - BrunoLM
  • @BrunoLM - この場合、OPはすでにすべてのクエリ結果を反復処理しています。より多くの" linqメソッド"データベースに対して実行する必要があります。query変数。解決策に問題があるとは限らないだけでなく、OPの問題を解決するための最善の方法もあります。マイナス投票を説明する気に? - Yakimych
  • 理由.ToList()うまくいくのは、あなたがIEnumerableコレクションはaで反復されます。怠惰な方法。この場合、毎回前々loopがアイテムを取得すると、クエリはdbまたは使用しているものからアイテムを取得します。もう一度繰り返したい場合は、クエリをやり直すことはできません。使うとき.ToList()、内のすべての項目IEnumerable処理されてリストとして保存されます。その後、作成したリストを何度でも使用できます。 - Vicro
  • さらに明確にする。問題の根本は、ストアドプロシージャが結果セットのみを返すことです。つまり、いったん終わりに達したら、最初に戻るにはクエリをやり直す必要があります。ただし、to listは結果セットをListデータ構造に変換します。このリストデータ構造は、好きなだけ列挙することができます。 - Ageis

6

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

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

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

そしてすべてがうまくいくでしょう。


  • これは私のために働いたが、私はなぜか分からない。 - Nicholas Pickering
  • tolist()を使用しない場合は、エンティティを解放します。エンティティが解放されていないことが予想されます。 - hosam hemaily

-5

このタイプのエラーが発生した場合は、通常のリストとしてprocデータを格納してから他のコントロールをバインドすることをお勧めします。このエラーも発生するので、このように解決しました。 例: -

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

こんな感じ

リンクされた質問


関連する質問

最近の質問