如何使用ADO.NET返回IEnumerable <>?

ado.net c# dapper

我一直在使用Dapper和我目前的項目,我將不得不使用ADO.NET。我的問題是如何使用ADO.NET返回IEnumerable?這是我使用Dapper的原因。有人可以幫我轉換這個但是用ADO做同樣的事嗎?

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

一般承認的答案

您可以像這樣使用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的Favorites構造函數來重構它,或創建一個實用程序方法來填充值,或者其他什麼,但這是基本結構。


熱門答案

如果你能做到,你所有的工作範圍內using塊,你可以利用LINQ和IEnumerable接口上DbDataReader 。它提供了自包含的純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 ...
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因