2

EFEDMを介してマップされたストアドプロシージャを実行するこのコードがあります。

meTest<MCTEntities, ObjectResult<retrieveMedia_Result>>(u => u.retrieveMedia(campaign_id: 1), ConnectionResolver.MCT_DB_Connection);

方法:

public static TValue meTest<U, TValue>(Func<U, TValue> func, String connection)
            where U : ObjectContext, new()
        {
            using (U entitiesContext = (U)Activator.CreateInstance(typeof(U), new[] { connection }))
            {
                return func(entitiesContext);
            }
    }

問題は、retrieveMediaが返さObjectResult<retrieveMedia_Result>れ、これが遅延実行で実行されるため、エラーが発生することです。Calling 'Read' when the data reader is closed is not a valid operation.

これで、ToList()またはToArray()を呼び出すことができることがわかりましたが、すぐに実行するように強制する他の方法はありますか?

キャストObjectResult<retrieveMedia_Result>することList<retrieveMedia_Result>が正しいことかどうかはわかりません。

4

2 に答える 2

2

ToListとToArrayはどちらもコレクションを列挙します。これにより、クエリが実行されます。AsEnumrableはクエリのビルドを完了します(つまり、クエリにビットを追加できなくなります)が、コレクションが列挙されるまで実際には実行されません。

あなたの例では、あなたのセットを列挙するアクションはデータを取得します。たとえば、foreach。

于 2012-09-23T19:38:38.413 に答える
0

コンテキストが破棄されたときに、結果を追加するToArray()ToList()、結果の反復を防ぐ必要があります。にキャストしてList<T>も役に立ちません。それは不可能ですらあります。

後で結果を繰り返すことができれば、それを何度も繰り返すリスクがあり、例外がスローされます。

于 2012-09-23T19:58:33.573 に答える