データベースの実行方法から重複を削除しようとしていました。次の構造を持つメソッドがたくさんありました。
IDbConnection connection = mConnections[pConnectionID];
bool wasAlreadyOpen = connection.State == ConnectionState.Open;
try
{
if (!wasAlreadyOpen)
connection.Open();
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = pSQL;
if (pParams != null)
ApplyParameters(pParams, command);
// do something interesting with command
}
}
finally
{
if (!wasAlreadyOpen)
connection.Close();
}
このシグネチャを使用して、このロジックを別のメソッドに抽出しました。
private object ExecuteQuery(int pConnectionID, string pSQL,
Func<IDbCommand, object> pQuery, IEnumerable<QueryParameter> pParams)
// do something
アルゴリズムの一部では、これを行います。
return pQuery(command);
1つの問題を除いて、これはうまくいくようです。私のExecuteReader
方法では、クエリ コードは次のようになります。
using (IDataReader reader = command.ExecuteReader())
if (reader != null)
while (reader.Read())
yield return reader;
問題は、遅延実行のために保存される「状態」が、ステートメントyield return
を含むメソッドからのみ取得されることです。yield
上記の 4 行を独自のメソッドまたは匿名メソッド/ラムダに抽出すると、データの読み取り中にデータベース接続を開いたままにするのに十分な状態がありません。
私がこれを行っている方法でこのロジックを抽出する方法はありますか、それともこの特定のメソッドをインライン化して重複を無視するだけですか?