Подтвердить что ты не робот

Использование Include с асинхронным ожиданием

У меня есть запрос EF, в котором я возвращаю "Item" по его уникальному идентификатору. Я использую контроллер леса, предоставляемый MVC, и это работает нормально, но теперь я хочу, чтобы он возвращал список тегов, принадлежащих этому элементу.

Я думал, что смогу использовать "Include", как показано ниже, чтобы получить нужные теги. Однако это не похоже на использование async.

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

Может кто-нибудь объяснить, почему это не сработает, и предложить альтернативный способ вернуть теги элементов?

Приветствия

Бен

4b9b3361

Ответ 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();