Итак, у вас есть последовательность InventoryViewModels
, где каждый InventoryViewModel
имеет ProductId
.
Вы хотите сгруппировать все InventoryViewModels
в группы, где каждая группа содержит все InventoryViewModels
с одинаковыми ProductId
. После этого вы хотите посчитать количество InventoryViewModels
в каждой группе и, возможно, также некоторые другие предметы. Ваш пример кода занимает первый элемент в группе.
var groupsWithSameProductId = inventoryViewModels
.GroupBy(inventoryViewModel => inventoryViewModel.ProductId)
Теперь у каждой группы есть Key
, который содержит ProductId
, который одинаков для всех элементов в вашей группе. Сама группа представляет собой последовательность всех InventoryViewModels
, которые имеют ProductId
, равный Key
.
Чтобы получить число InventoryViewModels
, у которого есть этот ProductId
, просто Count()
их. Если вы хотите другие предметы, просто Select
их:
// continue the LINQ statement
.Select(group => new
{
ProductId = group.Key,
NrOfInventroyViewModelsWithThisProductId = group.Count(),
// only if you want other items:
FirstInventoryViewModel = group.First(),
Names = group.Select(groupItem => groupItem.Name).ToList(),
});
Обратите внимание, что каждый groupItem
является InventoryViewModel
с ProductId
, равным group.Key
Существует перегрузка для Enumerable.GroupBy , которая объединяет группировку и выбор в одном операторе:
var result = inventoryViewModels
.GroupBy(inventoryViewModel => inventoryViewModel.ProductId, // make groups with same productId
(commonProductId, inventoryViewModelsWithThisCommonProductId) => new
{
ProductId = commonProductId,
Count = inventoryViewModelsWithThisCommonProductId.Count(),
Names = inventoryViewModelsWithThisCommonProductId
.Select(inventoryViewModelWithThisCommonProductId.Name)
.ToList(),
});