2012-07-24 20 views
15

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?¿Cómo devuelvo un IEnumerable <> usando ADO.NET?

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

¿Está contento trabajando con DataSets y DataRows para sus entidades (por ejemplo, Favoritos) o necesita clases fuertemente tipadas? – davenewza

+0

La funcionalidad estándar de ADO.NET no correlacionará los resultados de los datos con un objeto para usted. Básicamente obtendría un 'DataSet' de la consulta y tendría que construir sus objetos' Favoritos' a partir de eso. – David

+3

Simplemente itere a través de las filas 'DataSet',' produciendo un nuevo objeto 'Favorite' para cada uno – paul

Respuesta

19

Puede utilizar yield return así:

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, se puede refactorizar esto creando un constructor favoritos que acepta un IDataReader o SqlDataReader, o la creación de un método de utilidad para rellenar los valores o lo que sea, pero esta es la estructura básica.

0

Si puede hacer que trabaje todo dentro del bloque using, puede aprovechar LINQ y la interfaz IEnumerable 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 ... 
} 
Cuestiones relacionadas