Мы недавно перенесли наш 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)? но я не думаю, что это отвечает на мой вопрос.