代码之家  ›  专栏  ›  技术社区  ›  SteinTech

如何在AsyncMethod中实现Where

  •  -1
  • SteinTech  · 技术社区  · 6 年前

    我正在尝试使用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<TEntity>

    该项目以.NET标准2.0为目标,引用了Microsoft.EntityFrameworkCore 2.2.1,我已经定义了“使用Microsoft.EntityFrameworkCore”。

    我看到了 Doc's 大多数扩展都针对iQuery<>,但我使用的是IEnumerable<>。这就是问题所在吗? 但where()返回IEnumerable。

    有什么想法吗?

    3 回复  |  直到 6 年前
        1
  •  4
  •   juunas    6 年前

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

    所以:

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

    Func<TEntity, bool> 需要实际函数,而 Expression<Func<TEntity, bool>> 需要表达式树。 这个 IQueryable 基于此表达式树生成SQL查询。 通过使用func,可以调用从常规linq返回IEnumerable的where重载。 它没有tolistasync。

        2
  •  1
  •   Bit Helper    6 年前

    您必须添加包含在 EntityFramework.dll .

    请找到它 here .

        3
  •  0
  •   Nick    6 年前

    需要导入命名空间 Microsoft.EntityFrameworkCore . 见官员 documentation 了解更多详细信息。