Estoy llamando a un procedimiento almacenado con varios conjuntos de resultados (siempre 2) y escribiendo los resultados para separar los archivos (en formato delimitado por tuberías). No puedo dividir los conjuntos de resultados en procesos almacenados separados. Estoy usando IDataReader e IEnumerable para mantener tan poca memoria en el proceso.Mejor forma de consumir un IEnumerable <IEnumerable <string>>
¿Hay alguna manera más clara de consumir mi IEnumerable<IEnumerable<string>>
que usar GetEnumerator/MoveNext/Current para obtener el IEnumerable<string>
interno para pasar a 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);
}
}
Quizás no estaba claro al nombrar el método GetLines() - devuelve IEnumerable>. Debería haberlo llamado GetReaders() –
foson