使用async await与include的方法

38

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

我认为我可以像下面展示的那样使用“Include”来预先获取这些标签。然而,当使用异步时似乎不允许这样做。

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

有人能解释一下为什么这样不起作用,并提供一种替代方法来恢复该项的标签吗?

谢谢

Ben


http://msdn.microsoft.com/en-us/data/jj819165.aspx - L.B
2个回答

70

Find()FindAsync()DbSet类型的方法(这也是db.Items所表示的类型)。Include()返回一个DbQuery对象,这就是为什么不可用FindAsync()。使用SingleOrDefaultAsync()来完成与FindAsync()相同的操作。(区别在于它直接访问数据库,而不会先在上下文中查找实体是否存在)...

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

非常感谢。回答明确而简洁。太棒了! - B-Lat
6
请注意Single()和First()之间的性能差异,其中前者查找记录,然后继续查找以检查是否存在其他记录,而后者在找到记录后立即返回。 - Korayem

14

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

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

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

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