使用Include with async await
我有一个EF查询,我通过它的唯一标识符返回一个’Item’。 我正在使用MVC提供的脚手架控制器,这可以正常工作,但现在我希望它返回属于该项目的标签列表。
我想我可以使用如下所示的’Include’来急切地获取标签。 但是,使用异步时似乎不允许这样做。
Item item = await db.Items.Include("Tags").FindAsync(id);
任何人都可以解释为什么这不起作用并建议另一种方法来恢复项目的标签?
干杯
本
Find()
和FindAsync()
是DbSet
类型的方法( db.Items
就是这样)。 Include()
返回一个DbQuery
对象,这就是FindAsync()
不可用的原因。 使用SingleOrDefaultAsync()
来执行与FindAsync()
相同的FindAsync()
区别在于它将直接进入数据库并且不会查看上下文以查看实体是否存在)…
Item item = await db.Items.Include("Tags").SingleOrDefaultAsync(i => i.Id == id);
接下来是@Anthony和@Korayem的答案,我建议如下做更安全的代码。
Item item = await db.Items.Include(o => o.Tags).FirstOrDefaultAsync(i => i.Id == id); if(item == default(Item)) return NotFound();