实现 IAsyncEnumerable 的空 IQueryable
Empty IQueryable that implements IAsyncEnumerable
我正在寻找实现 IAsyncEnumerable<T>
的空 IQueryable<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)
您可以创建一个空的 IAsyncEnumerable,如 中所述。
但是如果我认为这不是一个理想的选择,因为它需要引用额外的包或自己实现 AsyncEnumerable.Empty。
或者,您可以以不需要 "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();
使用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();
}
我正在寻找实现 IAsyncEnumerable<T>
的空 IQueryable<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)
您可以创建一个空的 IAsyncEnumerable,如
但是如果我认为这不是一个理想的选择,因为它需要引用额外的包或自己实现 AsyncEnumerable.Empty。
或者,您可以以不需要 "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();
使用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();
}