我有一个执行 SQL 语句的方法,它返回我的类的一个实例,ResultSet
其中包含返回的行和列。我只想在调用者实际迭代结果时逐行读取数据。
public class ResultSet {
public IEnumerable<Row> Rows {
get;
private set;
}
public ResultSet(IEnumerable<Row> rows, IEnumerable<Column> columns) {
Rows = rows;
// columns and other code omitted
}
}
为此,我尝试将 IEnumerable 传递给我的类的构造函数,但问题是 DbDataReader 实例在您尝试迭代实例的Rows属性时已经被释放ResultSet
:
public ResultSet Execute(string sql) {
using (var command = Connection.CreateCommand()) {
command.CommandText = sql;
var reader = command.ExecuteReader();
try {
IEnumerable<Row> MyFunc()
{
while (reader.Read())
yield return new Row(reader);
}
var columns = GetColums(...);
return new ResultSet(MyFunc(), columns);
} finally {
reader.Dispose();
}
}
}
我知道我可以将 DbDataReader 实例传递给我的类,而不是在Execute
方法中处理它,但是我必须ResultSet
一次性使用,如果可能的话,我想避免这种情况。我不确定我正在尝试做什么?
我在执行之前查看了 using() { } 块 Disposes 内的 yield return 语句,但它并不完全相同,因为它不涉及一次性资源。