2014-02-16 43 views
22

我有一個EF查詢,其中我通過它的唯一標識符返回'Item'。我使用的是由MVC提供的腳手架控制器,這個工作正常,但現在我希望它返回屬於該項目的標籤列表。使用包含異步等待

我想我可以使用'Include'來獲取標籤。但是,在使用異步時,這似乎不被允許。

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

任何人都可以解釋爲什麼這不起作用,並建議一種替代方法來取回物品的標籤嗎?

乾杯

+0

http://msdn.microsoft.com/en-us/data/jj819165.aspx –

回答

45

Find()FindAsync()DbSet類型(這是什麼db.Items是)的方法。 Include()返回DbQuery對象,這就是爲什麼FindAsync()不可用。使用SingleOrDefaultAsync()做同樣的事情FindAsync()(所不同的是它會直接進入數據庫,並不會在背景下看看,如果在實體存在第一)...

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

非常感謝。清晰簡潔的答案。大! –

+0

注意Single()與First()之間的性能差異,其中前者查找找到記錄,然後繼續查看是否存在另一個存在,而後者在按下記錄時返回 – Korayem

4

其次@Anthony和@Korayem的回答,我建議按照下面的方法做更安全的代碼。

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

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