Как вернуть IEnumerable <> с помощью ADO.NET?

Я использую Dapper, и с моим текущим проектом мне придется использовать ADO.NET. Мой вопрос: как вернуть IEnumerable с помощью ADO.NET? Вот что я использую Dapper. Может ли кто-нибудь помочь мне с преобразованием этого, чтобы сделать то же самое, но с ADO?

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

Ответы

Ответ 1

Вы можете использовать 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;
                }
            }
        }
    }
}

Очевидно, что вы можете реорганизовать это, создав конструктор "Избранное", который принимает IDataReader или SqlDataReader, или создайте метод утилиты для заполнения значений или что-то еще, но это базовая структура.

Ответ 2

Если вы можете работать со всеми в блоке 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 ...
}