Как сделать рефакторинг IEnumerable <T>ExecuteDataReader <T>в асинхронный метод - PullRequest
0 голосов
/ 16 мая 2018
 public static IEnumerable<T> ExecuteDataReader<T>(string sql,  Func<TdDataReader, T> action)
    {
        using (var connection = new TdConnection(TDConnstring))
        {
            connection.Open();
            using (var cmd = connection.CreateCommand())
            {
                cmd.CommandText = sql;
               using (var dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        yield return action.Invoke(dr);
                }
            }
        }
    }

* как использовать асинхронную задачу> перезапись *

public static async Task<IEnumerable<T>> ExecuteDataReaderAsync<T>(string sql, Func<TdDataReader, T> action)
    {
        using (var connection = new TdConnection(TDConnstring))
        {
            await connection.OpenAsync();
            using (var cmd = connection.CreateCommand())
            {
                cmd.CommandText = sql;
                using (var dr = await cmd.ExecuteReaderAsync())
                {

                    while (await dr.ReadAsync())
                    {
                        yield return action.Invoke(dr);
                    }
                }
            }
        }
    }

* ошибка Код серьезности Описание Состояние проекта Подавление строки файла Ошибка CS1624 Тело 'TeraDataHelper.ExecuteDataReaderAsync (string, Func)' не можетбыть блоком итератора, потому что 'Task>' не является типом интерфейса итератора \ TeraDataHelper.cs 141 Active

*

1 Ответ

0 голосов
/ 16 мая 2018

понял

public static async Task<IEnumerable<T>> ExecuteDataReaderAsync<T>(string sql, Func<TdDataReader, T> action)
    {
        using (var connection = new TdConnection(TDConnstring))
        {
            await connection.OpenAsync();
            using (var cmd = connection.CreateCommand())
            {
                cmd.CommandText = sql;
                using (var dr = await cmd.ExecuteReaderAsync())
                {
                   return dr.Select(r => action(r)).ToList();
                }
            }
        }
    }

public static class Extensions
{

    public static IEnumerable<T> Select<T>(
        this TdDataReader reader, Func<TdDataReader, T> action)
    {

        while (reader.Read())
        {
            yield return action(reader);
        }
    }
}
...