【问题标题】:How to filter data by an async method in EFCore?如何通过 EFCore 中的异步方法过滤数据?
【发布时间】:2021-04-16 19:02:48
【问题描述】:

我想通过 ef core 过滤我的数据,我正在尝试通过返回 Task<bool> 的异步方法过滤用户。

var query = _context.User.AsQueryable();
query.Where(async (arg) => await _userInterface.CheckUserAvabilityAsync(user, arg.Id) == true);

但是使用这段代码,我得到了这个错误

CS4010:无法将异步 lambda 表达式转换为委托类型“Func”。异步 lambda 表达式可能返回 void、Task 或 Task,它们都不能转换为 'Func'。

那么如何通过我的方法过滤我的可查询数据?

【问题讨论】:

  • 那毫无意义。 EF Core 是一个 ORM。它将 LINQ 查询转换为 SQL。即使是简单的函数调用,您发布的内容也无法转换为 SQL - 对本地方法的调用如何转换为 SQL。至于异步,SQL 查询不指定如何检索数据,它们指定数据应该是什么。异步执行在 SQL 查询中没有任何意义

标签: c# .net-core ef-core-3.1


【解决方案1】:

该错误告诉您不能在谓词中使用异步。

不幸的是,您需要改变方法,循环访问内存中的数据。

// Get all data, convert to list
List<User> userRecords = _context.User.ToList();
List<User> availableUsers = new List<User>();
foreach (User userRecord in userRecords)
{
    //Assuming you will always successfully receive a boolean
    if (await _userInterface.CheckUserAvabilityAsync(user, userRecord.Id))
        availableUsers.push(userRecord);
}
return availableUsers;

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多