Вот мой метод Fill , который, учитывая общий список и лямбду, заполняет список объектами, считанными из IDataReader:
public static void Fill<T>(this IDbCommand cmd,
IList<T> list, Func<IDataReader, T> rowConverter)
{
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
list.Add(rowConverter(rdr));
}
}
}
Вы используете это так:
// var cmd = new SqlCommand(...);
// var things = new List<Thing>();
cmd.Fill(things, r => new Thing { ID = r.GetInt32(0), Name = r.GetString(1) });
Действительно удобно иметь возможность заключать циклы ExecuteReader и Read в одну строку, как эта.