C# 实现IAsyncEnumerable的空IQueryable

C# 实现IAsyncEnumerable的空IQueryable,c#,entity-framework,iqueryable,C#,Entity Framework,Iqueryable,我正在寻找一个空的IQueryable,它实现了IAsyncEnumerable。我的当前代码不工作,因为emptyEnumerable未实现IAsyncEnumerable。谢谢你的帮助或提示 我的设计如下: var result = Enumerable.Empty<Foo>().AsQueryable(); // Not working! if (condition1) { IQueryable<Foo> part1 = ....; resul

我正在寻找一个空的
IQueryable
,它实现了
IAsyncEnumerable
。我的当前代码不工作,因为empty
Enumerable
未实现
IAsyncEnumerable
。谢谢你的帮助或提示

我的设计如下:

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();
var result=Enumerable.Empty().AsQueryable();//不行!
如果(条件1)
{
可计量部分1=。。。。;
结果=结果Concat(第1部分);
}
如果(条件2)
{
可计量部分2=。。。。;
结果=结果Concat(第2部分);
}
返回等待结果。toListSync();
错误消息:

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)
源IQueryable未实现IAsyncEnumerable。只有实现IAsyncEnumerable的源才能用于实体框架异步操作。
位于Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AsAsAsAsyncEnumerable[TSource](IQueryable`1源)
位于Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListSync[TSource](IQueryable`1源,CancellationToken CancellationToken)

您可以创建一个空的IAsyncEnumerable,如中所述

但如果我认为这不是一个理想的选择,因为它需要引用一个额外的包或自己实现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();
var表达式=新列表();
如果(条件1)
{
可计量部分1=。。。。;
添加(第1部分);
}
如果(条件2)
{
可计量部分2=。。。。;
添加(第2部分);
}
var结果=表达式.聚合((acc,i)=>acc.Concat(i));
返回等待结果。toListSync();

使用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();
}
private静态异步任务GetList()
{
var result=Enumerable.Empty().AsQueryable();
如果(真)
{
IQueryable part1=新列表{new Foo()}.AsQueryable();
结果=结果Concat(第1部分);
}
如果(真)
{
IQueryable part2=新列表{new Foo(),new Foo()}.AsQueryable();
结果=结果Concat(第2部分);
}
返回等待结果。ToAsyncEnumerable().ToListSync();
}

只是好奇,你为什么需要这个?@MichaelRandall
我代表了从
DbSet
查询。结果是
IQueryable
。我正在尝试加入两个
IQueryable
并等待
toListSync()
<代码>结果需要实现
IAsyncEnumerable
才能解决所有问题。我想也许这篇文章可以给你一些想法:@AmirPopovich我理解,但我希望有一种方法不把moq引入项目中。@AmirPopovich我添加了我收到的错误消息