Пустой IQueryable, который реализует IAsyncEnumerable - PullRequest
3 голосов
/ 18 февраля 2020

Я ищу пустую IQueryable<T>, которая реализует IAsyncEnumerable<T>. Мой текущий код не работает, потому что пустой Enumerable не реализует IAsyncEnumerable<T>. Спасибо за любую помощь или подсказку.

У меня есть следующий дизайн:

var result = Enumerable.Empty<Foo>().AsQueryable();  // Not working!

if (condition1)
{
    IQueryable<Foo> part1 = ....;

    result = result.Concat(part1);
}

if (condition2)
{
    IQueryable<Foo> part2 = ....;

    result = result.Concat(part2);
}

return await result.ToListAsync();

Сообщение об ошибке:

The source IQueryable doesn't implement IAsyncEnumerable<Foo>. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AsAsyncEnumerable[TSource](IQueryable`1 source)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Используйте пакет nuget System.Linq.Async, чтобы получить метод ToAsyncEnumerable():

private static async Task<List<Foo>> GetList()
{
    var result = Enumerable.Empty<Foo>().AsQueryable();

    if (true)
    {
        IQueryable<Foo> part1 = new List<Foo> { new Foo() }.AsQueryable();
        result = result.Concat(part1);
    }

    if (true)
    {
        IQueryable<Foo> part2 = new List<Foo> { new Foo(), new Foo() }.AsQueryable();
        result = result.Concat(part2);
    }

    return await result.ToAsyncEnumerable().ToListAsync();
}
0 голосов
/ 18 февраля 2020

Вы можете создать пустой IAsyncEnumerable, как описано в этом SO .

Но если я не думаю, что это идеальный вариант, так как он требует ссылки на дополнительный пакет или реализации AsyncEnumerable.Empty самостоятельно.

Кроме того, вы можете изменить свой код таким образом, чтобы не требовать «пустой» контейнер для ваших выражений.

Например:

var expressions = new List<IQueryable<Foo>>();

if (condition1)
{
    IQueryable<Foo> part1 = ....;

    expressions.Add(part1);
}

if (condition2)
{
    IQueryable<Foo> part2 = ....;

    expressions.Add(part2);
}

var result = expressions.Aggregate((acc, i) => acc.Concat(i));

return await result.ToListAsync();
...