エンティティフレームワーク(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()
。
変化する
foreach (var item in query)
に
foreach (var item in query.ToList())
ToList
このリストのデータベースからすべての結果を取得しようとしていますが、これからはlinqメソッドでデータベースを処理することはできません。あなたが持っているデータの量とあなたがそれをどうするかによっては、これは深刻なパフォーマンスの問題になる可能性があります。 - BrunoLMquery
変数。解決策に問題があるとは限らないだけでなく、OPの問題を解決するための最善の方法もあります。マイナス投票を説明する気に? - Yakimych.ToList()
うまくいくのは、あなたがIEnumerableコレクションはaで反復されます。怠惰な方法。この場合、毎回前々loopがアイテムを取得すると、クエリはdbまたは使用しているものからアイテムを取得します。もう一度繰り返したい場合は、クエリをやり直すことはできません。使うとき.ToList()
、内のすべての項目IEnumerable処理されてリストとして保存されます。その後、作成したリストを何度でも使用できます。 - Vicro
これを交換してみてください
var query = context.Search(id, searchText);
と
var query = context.Search(id, searchText).tolist();
そしてすべてがうまくいくでしょう。
このタイプのエラーが発生した場合は、通常のリストとしてprocデータを格納してから他のコントロールをバインドすることをお勧めします。このエラーも発生するので、このように解決しました。 例: -
repeater.DataSource = data.SPBinsReport().Tolist();
repeater.DataBind();
こんな感じ