Я вызываю хранимую процедуру с несколькими наборами результатов (всегда 2) и записываю результаты в отдельные файлы (в формате с разделителями каналов). Я не могу разбить наборы результатов на отдельные хранимые процедуры. Я использую IDataReader и IEnumerable, чтобы в процессе было как можно меньше памяти.
Есть ли более чистый способ использования моего IEnumerable<IEnumerable<string>>
, чем использование GetEnumerator / MoveNext / Current для перехода к внутреннему IEnumerable<string>
для перехода к File.AppendAllLines?
public void Execute()
{
var reader = GetLines();
using (var enumerator = reader.GetEnumerator())
{
enumerator.MoveNext();
File.AppendAllLines("file1.dat", enumerator.Current);
enumerator.MoveNext();
File.AppendAllLines("file2.dat", enumerator.Current);
}
}
public IEnumerable<IEnumerable<string>> GetLines()
{
Database db = DatabaseFactory.CreateDatabase("connectionStringKey");
using (var command = db.GetStoredProcCommand("getdata_sp"))
{
var reader = db.ExecuteReader(command);
yield return GetInnerEnumerable(reader);
reader.NextResult();
yield return GetInnerEnumerable(reader);
}
}
private IEnumerable<string> GetInnerEnumerable(IDataReader reader)
{
while (reader.Read())
{
object[] rowValues = new object[reader.FieldCount];
reader.GetValues(rowValues);
yield return String.Join("|", rowValues);
}
}