Это зависит от того, что вы на самом деле хотите сделать в своем представлении: предполагается, что модель представления содержит именно те данные, которые необходимы для отображения представления.Обычно вы не хотели бы включать туда больше данных.Поэтому использование моделей базы данных внутри модели представления не лучший выбор;было бы лучше спроектировать реальные модели представлений, которые соответствуют отображаемому материалу, и затем вы решите, как правильно получить эти данные.
Исходя из того, как выглядит ваша модель представления, я мог бы предположить два варианта использования:
- Вы хотите отобразить набор продуктов и перечислить те типы продуктов, которые имеют этот набор продуктов.
- Вы хотите отобразить набор продуктов и список все типы продуктов.
Вариант 2 действительно прост и требует, чтобы вы запрашивали каждый тип сущности только один раз:
var viewModel = new ProductsViewModel
{
Products = await db.Products.ToListAsync(),
ProductTypes = await db.ProductTypes.ToListAsync(),
};
Вариант 1 можно наивно решить, включив продуктвводится через свойство навигации в сущности Product
:
var products = await db.Products.Include(p => p.ProductType).ToListAsync();
var viewModel = new ProductsViewModel
{
Products = products,
ProductTypes = products.Select(p => p.ProductType).Distinct().ToList(),
};
Однако это имеет недостаток, заключающийся в том, что при наличии нескольких отдельных типов продуктов вы будете загружать каждый тип продукта несколько раз.Поскольку тип вашего продукта имеет только идентификатор и имя, это не , что проблематично, а для более сложных типов может быть.
Другой подход заключается всначала запросите идентификаторы типов продуктов из списка продуктов, а затем загрузите типы продуктов:
var products = await db.Products.Include(p => p.ProductType).ToListAsync();
var productTypeIds = product.Select(p => p.ProductTypeId).Distinct().ToList();
var viewModel = new ProductsViewModel
{
Products = products,
ProductTypes = await db.ProductTypes.Select(t => productTypeIds.Contains(t.Id)).ToListAsync(),
};
Два примечания:
- Я проигнорировал существование вашегорепозиторий здесь и просто предполагается, что вы используете EntityFramework
DbContext
здесь.Если вы хотите абстрагировать это в хранилище, вы можете сделать это. - Сущность с именем
Products
, но содержит информацию только об одном продукте.Аналогично, модель представления содержит свойство Products
того же типа.Это не имеет большого смысла для меня, поэтому я просто предположил, что сущность называется Product
и представляет отдельный элемент, в то время как ProductsViewModel
имеет Products
, список Product
.