Использование IAsyncEnumerable с Dapper - PullRequest
2 голосов
/ 28 января 2020

Мы недавно перенесли наш ASP. NET Core API, который использует Dapper в. NET Core 3.1. После миграции мы почувствовали, что появилась возможность использовать новейшую функцию IAsyncEnumerable из C# 8 для одной из наших конечных точек.

Вот псевдокод до изменений:

public async Task<IEnumerable<Item>> GetItems(int id)
{
    var reader = await _connection.QueryMultipleAsync(getItemsSql,
       param: new
       {
           Id = id
       });

    var idFromDb = (await reader.ReadAsync<int?>().ConfigureAwait(false)).SingleOrDefault();
    if (idFromDb == null)
    {
       return null;
    }

    var items = await reader.ReadAsync<Item>(buffered: false).ConfigureAwait(false);

    return Stream(reader, items);
} 

private IEnumerable<Item> Stream(SqlMapper.GridReader reader, IEnumerable<Item> items)
{
    using (reader)
    {
        foreach (var item in items)
        {
            yield return item;
        }
    }     
}

После IAsyncEnumerable изменения кода:

// Import Nuget pacakage: System.Linq.Async

public async Task<IAsyncEnumerable<Item>> GetItems(int id)
{
    var reader = await _connection.QueryMultipleAsync(getItemsSql,
       param: new
       {
           Id = id
       });

    var idFromDb = (await reader.ReadAsync<int?>().ConfigureAwait(false)).SingleOrDefault();
    if (idFromDb == null)
    {
        return null;
    }

    var items = await reader.ReadAsync<Item>(buffered: false).ConfigureAwait(false);

    return Stream(reader, items);
} 

private IAsyncEnumerable<Item> Stream(SqlMapper.GridReader reader, IEnumerable<Item> items)
{
    using (reader)
    {
       await foreach (var item in items.ToAsyncEnumerable())
       {
           yield return item;
       }
    }
 }

Вышеупомянутый подход состоит в том, чтобы использовать ToAsyncEnumerable свободно вдохновленный из этого поста , но я не уверен на 100%, если я ' используя его в нужном месте / контексте.

Вопрос:

  • Библиотека dapper возвращает только IEnumerable, но мы можем использовать ToAsyncEnumerable, чтобы преобразовать ее в IAsyncEnumerable для async stream как указано выше?

Примечание : этот вопрос похож на Что происходит с возвратом IEnumerable, если используется с async / await (потоковая передача данных из SQL Сервер с Dapper)? но я не думаю, что это отвечает на мой вопрос.

...