Я новичок в linq и не понимаю, как это записать.
У меня есть коллекция под названием animalList
AnimalName - MG - Hatch
An1 - 1 - 1
An1 - 1 - 2
An1 - 1 - 3
An2 - 2 - 4
An2 - 2 - 3
Мне нужно увидеть каждого животного и количество комбинаций мг/люка:
AnimalName - Count
An1 - 3
An2 - 2
Для каждого животного мне нужен отдельный счет, где строки MG/Hatch имеют разные значения.
Здесь запрос, с которым я работаю, но у меня все еще возникают проблемы с правильным подсчетом.
var query = (from a in animalList).ToList()
group a by new { a.AnimalName, a.MG,a.Hatch }
into grp
select new
{
grp.Key.AnimalName,
grp.Key.MG,
grp.Key.Hatch,
Quantity = grp.Count()
}).ToList();
Прежде всего, ваш запрос не компилируется. Чтобы скомпилировать его, вам придется изменить
(from a in animalList).ToList()
в
(from a in animalList
Помимо этого, вы группируете животных по всем свойствам (group a by new { a.AnimalName, a.MG,a.Hatch }
). Это даст вам группу для каждой комбинации AnimalName
, MG
и Hatch
. В вашем случае нет животных с тем же именем, штриховкой и MG, поэтому все записи в списке получат свою собственную группу, что приведет к тому, что grp.Count()
вернется 1.
Если я правильно вас понимаю, вы можете решить это с помощью вложенного запроса.
Что-то вроде этого:
var query = from animal in animalList
group animal by animal.AnimalName into grp
select new
{
AnimalName = grp.Key,
Quantity = (from an in grp
group an by new { an.Hatch, an.MG } into combinations
select combinations).Count()
};
Внешний запрос группирует животных по имени, а внутренний запрос находит разные комбинации для Hatch
и MG
.