我试图从我的数据库执行方法中删除一些重复。我有一堆具有以下结构的方法:
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);
这似乎工作得很好,除了一个问题。在我的ExecuteReader
方法中,查询代码如下所示:
using (IDataReader reader = command.ExecuteReader())
if (reader != null)
while (reader.Read())
yield return reader;
问题似乎是为yield return
延迟执行而保存的“状态”仅取自包含该yield
语句的方法。如果我将上面的这四行提取到它自己的方法或匿名方法/lambda,那么在读取数据时没有足够的状态来保持数据库连接打开。
有没有办法以我这样做的方式提取这个逻辑,还是我只剩下内联这个特定方法并忽略重复?