このコード行をご覧ください。これはストアドプロシージャの呼び出しで、ObjectResult<long?>
を返します。長い値を抽出するために、私は選択を追加しました:.NETエンティティフレームワーク - IEnumerable VS. IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
この選択はIEnumerable<long>
を返します。私はいつもEF APIが返すときIEnumerable
(とないIQueryable
)、この結果は、マテリアライズされていることを意味していると考え -
私はそれがどこか多分ちょうどこの仮定に慣れ読んでいるかどうかはわかりません。彼らはデータベースから引き出されたという意味です。
今日私が間違っていたことが判明しました(あるいはバグかもしれません)。私は基本的には、このエラーは、あなたがいる間、変更を保存しようとしていることを示しています
「のセッションで実行されている他のスレッド があるので、新しいトランザクションは許可されていません」というエラーにを取得保管しましたdbリーダーはまだレコードを読み込んでいます。
結局私は(私はロングショット考慮したもの)によってそれを解決しそう
IEnumerable<long>
...をマテリアライズする
ToArray()
コールを追加 - ボトムラインを - 私はEFからIEnumerable
結果は、その避難所の結果が含まれていることを期待すべきですまだ実現していない?はいの場合、IEnumerable
が具体化されているかどうかを知る方法はありますか?IEnumerable<T>
の作業おかげで、これはそれらの「duhhhの質問の一つである場合に謝罪... :)
EFのために具体的に書かれているものがあるかどうか分かりませんが、一般的にLinqの場合、 'IEnumerable'は 'IQueryable 'よりも"マテリアライズ "されません。 –
@Damien_The_Unbeliever:しかし、ObjectResultは、関数が呼び出されたときに常に実行されると思います...(この場合はFindCoursesWithKeywords) –