Я не знаю, что делает FirstAsync(vm.Id)
. Насколько я знаю, нет перегрузки, которая принимает целое число в качестве параметра. Я думаю, что ваша FirstAsyn c делает что-то похожее на:
Product model = await db.Products
.Where(product => product.Id == vm.Id)
.FirstAsync();
Или, может быть, даже лучше: FirstOrDefaultAsync
.
Ваша цель - сделать левое внешнее соединение, а иногда нет, в зависимости от одного из свойств левого элемента.
Ваше решение извлекает левый элемент объединения, извлекает ключ объединения и выбирает правый элемент объединения. Фактически, ваш процесс выполняет объединение при выполнении двух запросов к базе данных.
Системы управления базами данных чрезвычайно оптимизированы для объединений. Два отдельных запроса к базе данных без объединения почти наверняка менее эффективны, чем один запрос с объединением.
Я бы посоветовал сделать один запрос для извлечения данных, которые вам могут понадобиться.
var fetchedData = dbContext.Products
.Where(product => product.Id == vm.Id)
.Select(product => new
{
Title = product.Title,
Available = product.Available,
CategoryTitle = product.Category.Title,
})
.FirstOrDefaultAsync();
Теперь вы можете заполнить vm:
if (fetchedData != null)
{
vm.Title = fetchedData.Title;
if (fetchedData.Available)
{
vm.CategoryTitle = fetchedData.CategoryTitle;
}
}
// TODO: decide what to do if there is no fetched data?