【问题标题】:Use of Include with async await使用包含异步等待
【发布时间】:2014-02-16 22:26:14
【问题描述】:

我有一个 EF 查询,其中我通过它的唯一标识符返回一个“项目”。我正在使用 MVC 提供的脚手架控制器,这工作正常,但现在我希望它返回属于该项目的标签列表。

我认为我可以使用如下所示的“包含”来急切地获取标签。但是,在使用 async 时似乎不允许这样做。

Item item = await db.Items.Include("Tags").FindAsync(id);

谁能解释为什么这不起作用并建议一种替代方法来恢复项目的标签?

干杯

【问题讨论】:

标签: c# asp.net-mvc entity-framework asynchronous


【解决方案1】:

Find()FindAsync()DbSet 类型的方法(这就是 db.Items 是什么)。 Include() 返回一个DbQuery 对象,这就是FindAsync() 不可用的原因。使用SingleOrDefaultAsync()FindAsync() 做同样的事情(不同的是它会直接进入数据库,不会先在上下文中查看实体是否存在)...

Item item = await db.Items.Include("Tags").SingleOrDefaultAsync(i => i.Id == id);

【讨论】:

  • 非常感谢。清晰简洁的答案。太好了!
  • 注意 Single() 与 First() 之间的性能差异,前者查找记录,然后继续检查是否存在另一个记录,而后者在命中记录后返回
【解决方案2】:

在@Anthony 和@Korayem 的回答之后,我建议按照以下方式操作以获得更安全的代码。

Item item = await db.Items.Include(o => o.Tags).FirstOrDefaultAsync(i => i.Id == id);

if(item == default(Item))
    return NotFound();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2023-03-12
    • 2016-07-07
    • 2016-03-25
    • 2017-10-09
    相关资源
    最近更新 更多