Как вернуть 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;
    }
}

person haydnD    schedule 24.07.2012    source источник
comment
Довольны ли вы работой с DataSets и DataRows для своих сущностей (например, Избранное) или вам нужны строго типизированные классы?   -  person Dave New    schedule 24.07.2012
comment
Стандартная функциональность ADO.NET не будет отображать результаты данных в объект за вас. По сути, вы получите DataSet из запроса и должны будете построить свои Favorites объекты из этого.   -  person David    schedule 24.07.2012
comment
Просто выполните итерацию по DataSet строкам, yield создавая новый Favorite объект для каждой из них.   -  person paul    schedule 24.07.2012
comment
В противном случае вы можете вызвать AsEnumerable() в DataTable, чтобы вернуть IEnumerable‹DataRow›.   -  person Dave New    schedule 24.07.2012
comment
@paul ADO.NET не обязательно означает DataSet. Это слой поверх ADO.NET.   -  person Marc Gravell    schedule 24.07.2012
comment
Просто говорю... dapper полностью использует ADO.NET. Вы можете просто добавить в свой проект один файл .cs (SqlMapper.cs IIRC), назвав его MyUsefulUtility.cs вместо dapper. Я не буду возражать, и мы никому не скажем ;p   -  person Marc Gravell    schedule 24.07.2012
comment
Что не так с использованием Dapper? Вы хотите сделать то же самое, но вручную?   -  person Sergey Berezovskiy    schedule 24.07.2012
comment
Должен любить ТАК... Вы только что спросили, как вы можете эмулировать Dapper в своем проекте ADO.net. И один из авторов (@MarcGravell) Dapper только что сказал вам, какой файл .cs взять и переименовать, чтобы эмулировать его в вашем проекте. Одно слово, Круто!!!   -  person jsmith    schedule 24.07.2012


Ответы (2)


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

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

person Steve Czetty    schedule 24.07.2012

Если вы можете выполнять всю работу в блоке 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 ...
}
person Edward Brey    schedule 20.10.2015