【问题标题】:how to implement WHERE in asyncmethod如何在异步方法中实现 WHERE
【发布时间】:2019-01-16 14:57:11
【问题描述】:

我正在尝试使用 Where() 实现异步方法。我找不到 Where 方法的任何异步版本。 ToListAsync 不适用于 IEnumerable。我应该使用不同的方法吗?

public async Task<IEnumerable<TEntity>> Where(Func<TEntity, bool> predicate)
{
    var tmp = await this.DbSet.Where(predicate).ToListAsync(); //error: ToListAsync not available

    return tmp;
}

DbSet 的类型为 DbSet&lt;TEntity&gt;

该项目以 .NET Standard 2.0 为目标并引用 Microsoft.EntityFrameworkCore 2.2.1,并且我定义了“使用 Microsoft.EntityFrameworkCore”。

我在Doc's 中看到大多数扩展都针对 IQueryable,但我使用的是 IEnumerable。这可能是问题吗? 但是 Where() 返回 IEnumerable。

有什么想法吗?

【问题讨论】:

  • @er-mfahhgk 你知道 ASP.NET Core 是否有类似的东西吗?

标签: c# linq asp.net-core


【解决方案1】:

您需要使用表达式,而不是函数。

所以:

public async Task<IEnumerable<TEntity>> Where(Expression<Func<TEntity, bool>> predicate)
{
    var tmp = await this.DbSet.Where(predicate).ToListAsync();
    return tmp;
}

Func&lt;TEntity, bool&gt; 需要一个实际函数,而Expression&lt;Func&lt;TEntity, bool&gt;&gt; 需要一个表达式树。 IQueryable 基于此表达式树构建您的 SQL 查询。 通过使用 Func,您可以从常规 LINQ 调用 Where 的重载,这将返回一个 IEnumerable。 哪个没有 ToListAsync。

【讨论】:

    【解决方案2】:

    您需要导入命名空间Microsoft.EntityFrameworkCore。详情请见官方documentation

    【讨论】:

    • 我使用 Microsoft.EntityFrameworkCore 2.2.1 并且“使用 Microsoft.EntityFrameworkCore”
    【解决方案3】:

    您必须添加包含在EntityFramework.dll 中的名称空间。

    请找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2023-03-25
      • 1970-01-01
      • 2015-03-29
      • 2014-09-24
      • 2018-06-14
      相关资源
      最近更新 更多