¿Cómo devuelvo un IEnumerable <> usando ADO.NET?

ado.net c# dapper

Pregunta

He estado usando Dapper y con mi proyecto actual voy a tener que usar ADO.NET. Mi pregunta es ¿cómo devuelvo un IEnumerable usando ADO.NET? Esto es lo que tengo usando Dapper. ¿Alguien puede ayudarme a convertir esto para hacer lo mismo pero con ADO?

public IEnumerable<Favorites> GetFavorites()
{
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        var work = sqlConnection.Query<Favorites>("Select * from favorites");
        return work;
    }
}

Respuesta aceptada

Puede usar el yield return manera:

public IEnumerable<Favorites> GetFavorites()
{
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        using (SqlCommand cmd = sqlConnection.CreateCommand())
        {
            cmd.CommandText = "Select * from favorites";
            cmd.CommandType = CommandType.Text;
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    // Create a Favorites instance
                    var favorites = new Favorites();
                    favorites.Foo = reader["foo"];
                    // ... etc ...
                    yield return favorites;
                }
            }
        }
    }
}

Obviamente, puede refactorizar esto creando un constructor de Favoritos que acepte un IDataReader o SqlDataReader , o creando un método de utilidad para poblar los valores, o lo que sea, pero esta es la estructura básica.


Respuesta popular

Si usted puede hacer usted trabaja todo dentro del using bloques, usted puede tomar ventaja de LINQ y el IEnumerable interfaz en DbDataReader . Proporciona ADO.NET puro y autónomo con una cantidad de código razonablemente pequeña.

var command = connection.CreateCommand();
command.CommandText = "select * from favorites";
using (var reader = command.ExecuteReader()) {
    var work = from IDataRecord r in select ...;
    ... use work ...
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow