Использование Include с асинхронным ожиданием
У меня есть запрос EF, в котором я возвращаю "Item" по его уникальному идентификатору. Я использую контроллер леса, предоставляемый MVC, и это работает нормально, но теперь я хочу, чтобы он возвращал список тегов, принадлежащих этому элементу.
Я думал, что смогу использовать "Include", как показано ниже, чтобы получить нужные теги. Однако это не похоже на использование async.
Item item = await db.Items.Include("Tags").FindAsync(id);
Может кто-нибудь объяснить, почему это не сработает, и предложить альтернативный способ вернуть теги элементов?
Приветствия
Бен
Ответы
Ответ 1
Find()
и FindAsync()
являются методами типа DbSet
(что и есть db.Items
). Include()
возвращает объект DbQuery
, поэтому FindAsync()
недоступен. Используйте SingleOrDefaultAsync()
, чтобы сделать то же самое, что и FindAsync()
(разница в том, что он пойдет прямо в базу данных и не будет выглядеть в контексте, чтобы увидеть, существует ли сущность в первую очередь)...
Item item = await db.Items.Include("Tags").SingleOrDefaultAsync(i => i.Id == id);
Ответ 2
Далее следуют @Anthony и @Korayem, я рекомендую сделать как ниже безопасный код.
Item item = await db.Items.Include(o => o.Tags).FirstOrDefaultAsync(i => i.Id == id);
if(item == default(Item))
return NotFound();