using System; using System.Linq; public class Pet { public string Name { get; set; } public string Type { get; set; } public string Owner { get; set; } } public class Owner { public string Name { get; set; } public string Country { get; set; } } public class Test { public static void Main() { 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" } }; 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() }; foreach(var e in el) { Console.WriteLine(e.Country + " "+ e.Type+" "+e.Count); } } }