【问题标题】:Empty IQueryable that implements IAsyncEnumerable实现 IAsyncEnumerable 的空 IQueryable
【发布时间】:2020-06-02 02:41:14
【问题描述】:

我正在寻找实现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)

【问题讨论】:

  • 只是好奇,你为什么需要这个?
  • @MichaelRandall .... 我代表来自DbSet 的查询。结果是IQueryable&lt;Foo&gt;。我正在尝试加入这两个IQueryable&lt;Foo&gt; 并等待ToListAsync()result 需要实现 IAsyncEnumerable&lt;Foo&gt; 才能让一切顺利进行。我认为
  • 或许这篇文章能给你一些想法:stackoverflow.com/questions/59071994/…
  • @AmirPopovich 我明白,但我希望有办法不将起订量带入项目。
  • @AmirPopovich 我添加了我收到的错误消息

标签: c# entity-framework iqueryable


【解决方案1】:

使用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();
}

【讨论】:

    【解决方案2】:

    您可以创建一个空的 IAsyncEnumerable,如 this 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多