Entity Framework - 异步选择带有 where 条件

43

我正在使用ASP.NET Core与Entity Framework。

首先我选择一个员工,然后选择所有满足条件的员工(为了显示哪些工作):

var a = db.Employee.FirstOrDefault();
var b = db.Employee.Where(x => x.FirstName == "Jack");

现在我尝试使用异步方式执行相同的操作:

var c = await db.Employee.FirstOrDefaultAsync();
var d = await db.Employee.Where(x => x.FirstName == "Jack");

然而,“WHERE”没有异步版本,代码的第二行无法编译 - 出现错误。

...不包含GetAwaiter的定义...

在这种情况下,我如何执行具有“WHERE”条件的“SELECT”操作?


好的,从答案中我看到ToListAsync()将解决“var d = ...”行的问题。但是,有一个继续存在的问题,我之前没有意识到它很重要。在这种情况下,我只是尝试选择一组将被删除的记录,我并不想访问数据以便在代码中进一步操作它。所以我修改了所有4个代码版本,目的是同步或异步地删除一个或多个记录。为什么只有最后一个需要ToListAsync(),那样不会实际从数据库检索记录吗?

var a = db.Employee.FirstOrDefault();
db.Employee.Remove(a);
// db.Employee.RemoveRange(a); <- this also works?
db.SaveChanges();

var b = db.Employee.Where(x => x.FirstName == "Jack");
db.Employee.RemoveRange(b);
db.SaveChanges();

var c = await db.Employee.FirstOrDefaultAsync();
db.Employee.Remove(c);
await db.SaveChangesAsync();

var d = await db.Employee.Where(x => x.FirstName == "Jack").ToListAsync();
db.Employee.RemoveRange(d);
await db.SaveChangesAsync();

1
使用 ToArrayAsync、ToListAsync。 - Evk
RemoveRange将首先从数据库中提取所有项目,然后标记为已删除。因此,先调用ToListAsync不会有任何影响 - 否则它将由RemoveRange本身(同步地)完成。 - Evk
但是没有必要从数据库中拉取所有记录,只为了删除它们... - Marko
我同意,但这就是你所做的,也是EF在删除方面的工作方式。不过有一些解决方法,你可以谷歌找到它们(例如:https://github.com/loresoft/EntityFramework.Extended/blob/master/readme.md)。 - Evk
1个回答

87

你可以像这样做。

如果你需要检索一个对象,那么:

var d = await db.Employee.FirstOrDefaultAsync(x => x.FirstName == "Jack");

如果你需要检索列表,则:

 var d = await db.Employee.Where(x => x.FirstName == "Jack").ToListAsync();

如何将列表转换为对象以作为响应返回? - variable
@变量,不确定您正在使用什么,而且可能为时已晚,但您可以尝试将列表作为响应返回。 - symbiont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接