2

私が遭遇した興味深い問題は、完全に理にかなっています。私は次のような一般的な方法を持っています:

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 ステートメントを移動することもできますが、すべてのデリゲートに対してこれを行うことを避けることができれば、それは素晴らしいことです。何か案は?

4

1 に答える 1

5

多分:

public TResult Run<TResult>(Func<SqlDataReader, TResult> resultDelegate)
{
   TResult result;

   using (SqlDataReader reader = command.ExecuteReader()) // command is SqlCommand with attached SqlConnection
   {
      result = resultsDelegate(reader);
      if (typeof(TResult) == typeof(IEnumerable<object>)) 
      {
         var enumerable = result as IEnumerable<object>;
         if (enumerable != null) 
         {
            result = enumerable.ToList();  
         }
      }
   }

   // Some other unrelated code (but that's why result has a variable)

   return result;

}
于 2010-10-22T19:32:59.660 に答える