实体框架 - 使用 where 条件进行异步选择

Posted

技术标签:

【中文标题】实体框架 - 使用 where 条件进行异步选择【英文标题】:Entity Framework - async select with where condition 【发布时间】:2017-04-03 13:07:30 【问题描述】:

我将 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();

【问题讨论】:

使用 ToArrayAsync、ToListAsync。 RemoveRange 将首先从数据库中提取所有项目,然后标记为已删除。所以首先调用 ToListAsync 没有害处 - 否则它将由 RemoveRange 本身(同步)完成。 但是从数据库中提取所有记录只是为了删除它们是没有意义的...... 我同意,但这就是你所做的,这就是 EF 处理删除的方式。不过有一些解决方法,你可以用谷歌搜索它们(例如:github.com/loresoft/EntityFramework.Extended/blob/master/…) 【参考方案1】:

你可以这样做。

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

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

如果您需要检索 list 则:

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

【讨论】:

如何将列表转换为对象作为响应返回?

以上是关于实体框架 - 使用 where 条件进行异步选择的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中选择 WHERE IN

在循环中使用 IQueryable 的实体框架 WHERE OR 查询

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

使用实体框架 (EF) 进行动态数据查询

实体框架 Linq 查询:.Where 链 vs &&

使用条件 API 选择 * from where ... 子句