2012-07-24 87 views
15

我一直在使用Dapper和我目前的项目,我将不得不使用ADO.NET。我的问题是如何使用ADO.NET返回IEnumerable?这是我使用Dapper的。有人可以帮我转换这个做同样的,但与ADO?如何使用ADO.NET返回IEnumerable <>?

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

您是否开心使用DataSets和DataRows为您的实体(例如收藏夹)或者是否需要强类型类? – davenewza 2012-07-24 15:34:41

+0

标准的ADO.NET功能不会将数据结果映射到您的对象。你基本上会从查询中找回一个'DataSet',并且必须从中建立你的'Favorites'对象。 – David 2012-07-24 15:34:55

+3

只需遍历DataSet行,为每个对象产生一个新的最喜欢的对象 – paul 2012-07-24 15:35:26

回答

19

您可以使用yield return像这样:

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; 
       } 
      } 
     } 
    } 
} 

很明显,你可以通过创建一个收藏夹构造函数,它接受一个IDataReaderSqlDataReader,或创建一个实用的方法来填充值重构这个,或者无论如何,但这是基本的结构。

0

如果您可以在using区块内完成所有工作,则可以利用LINQ和DbDataReader上的IEnumerable接口。它提供了包含相当少量代码的自包含的纯ADO.NET。

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