私が遭遇した興味深い問題は、完全に理にかなっています。私は次のような一般的な方法を持っています:
public TResult Run<TResult>(Func<SqlDataReader, TResult> resultDelegate)
{
TResult result;
using (SqlDataReader reader = command.ExecuteReader()) // command is SqlCommand with attached SqlConnection
{
result = resultsDelegate(reader);
}
// Some other unrelated code (but that's why result has a variable)
return result;
}
あるケースでは、resultDelegate
の戻り型 ( TResult
) はIEnumerable<object>
です。問題は、Run
遅延実行のために関数がすぐに返され、SqlDataReader が破棄されることです。コードの後半で結果を読み込もうとすると (デリゲートが行うreader.Read()
と、InvalidOperationException: Invalid attempt to call Read when reader is closed.
これを回避する最善の方法を見つけるのに苦労しています。具体的なリストを返すことができることはわかっていますが、可能であればそれを避けたいと思います。デリゲート内で using ステートメントを移動することもできますが、すべてのデリゲートに対してこれを行うことを避けることができれば、それは素晴らしいことです。何か案は?