如何在异步方法中实现WHERE

时间:2019-01-16 06:11:46

标签: c# linq asp.net-core

我正在尝试使用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 Standard 2.0,并引用了Microsoft.EntityFrameworkCore 2.2.1,并且我已经定义了“使用Microsoft.EntityFrameworkCore”。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

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

所以:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
       print("activityType: ", userActivity.activityType)
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
            let univrsalLinkURL = userActivity.webpageURL!.absoluteString
            print(univrsalLinkURL)
        }
        return true
    }

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>>基于此表达式树构建您的SQL查询。 通过使用Func,您可以从常规LINQ中调用Where的重载,这将返回IEnumerable。 没有ToListAsync。

答案 1 :(得分:0)

您需要导入名称空间Microsoft.EntityFrameworkCore。有关更多详细信息,请参见官方documentation

答案 2 :(得分:0)

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

here找到它。