Группировка по 2-ум полям в LINQ

154
28 марта 2018, 02:11

Есть 2 набора данных - питомцы:

Pet[] pets =
        {
            new Pet() { Name = "Vasya", Type = "Cat", Owner = "John" },
            new Pet() { Name = "Borya", Type = "Dog", Owner = "Dean" },
            new Pet() { Name = "Kim", Type = "Hedgehog", Owner = "Mary" },
            new Pet() { Name = "Joka", Type = "Dog", Owner = "John" },
            new Pet() { Name = "Mursick", Type = "Cat", Owner = "Dean" },
            new Pet() { Name = "Mick", Type = "Cat", Owner = "Mary" },
            new Pet() { Name = "John", Type = "Hedgehog", Owner = "John" },
            new Pet() { Name = "Jynx", Type = "Dog", Owner = "Dean" }
        };

И их владельцы:

Owner[] owners =
        {
            new Owner() { Name = "John", Country = "USA" },
            new Owner() { Name = "Mary", Country = "Switzerland" },
            new Owner() { Name = "Dean", Country = "Great Britain" }
        };

По этим 2-ум наборам я хочу определить, сколько питомцев каждого типа проживает в каждой стране. Т.е. мне нужен LINQ-запрос, эквивалентный такому SQL-запросу:

SELECT O.Country, P.Type, Count(P.Type) AS Amount
FROM owners AS O INNER JOIN pets AS P
ON O.Name = P.Owner
GROUP BY O.Country, P.Type;

Можно ли получить такое при помощи LINQ?

Answer 1

Такое выражение получилось

var el = from o in owners
         join p in pets
         on o.Name equals p.Owner
         group p by new {o.Country, p.Type}
         into grp 
             select new { 
                          Country = grp.Key.Country, 
                          Type = grp.Key.Type, 
                          Count = grp.Count() 
                        };

Тестируем тут - https://ideone.com/agkzWZ

Answer 2

Как-то так

 var result = owners.Join(pets, o => o.Name, p => p.Owner, (o,p) => new{o,p})
            .GroupBy(j => new { j.o.Country, j.p.Type})
            .Select(g => new {g.Key.Country, g.Key.Type, Amount = g.Count(), });
READ ALSO
Иерархия консольного меню

Иерархия консольного меню

Может кто знает как правильно организовывать вызовы меню в логике консольного приложения? Допустим есть класс логикиИ много классов меню

174
C# WPF поставить иконку для окна

C# WPF поставить иконку для окна

Добавил в resources новую иконку, для окна в свойстве icon указал ееВ XAML добавило

159
Что значит int[] при создании метода [требует правки]

Что значит int[] при создании метода [требует правки]

На CodeWars тонны таких заданий с такой штукой и я не понимаю что оно делает По типу public void int

158
Тестирование методов

Тестирование методов

Подскажите как нужно писать модульные тесты для методов, которые вызывают другие методы?

138