public static void Test() { Basket b1 = new Basket(); b1.AddFruit(new Banana() { Description = new FruitDescription(FruitSize.Medium, FruitColor.Blue) }); b1.AddFruit(new Banana() { Description = new FruitDescription(FruitSize.Medium, FruitColor.Green) }); Basket b2 = new Basket(); b2.AddFruit(new Pear() { Description = new FruitDescription(FruitSize.Medium, FruitColor.Green) }); List <Basket> source = new List <Basket>(); source.Add(b1); source.Add(b2); //the main event - a query. List <Pair <Fruit, Basket> > result = ( from basket in source from fruit in basket.GetFruits() select new Pair <Fruit, Basket>() { First = fruit, Second = basket } ).ToList(); //a second results structure for fun ILookup <Type, Basket> resultByType = result.ToLookup ( p => p.First.GetType(), p => p.Second ); Console.WriteLine("Number of fruit: {0}", result.Count); Console.WriteLine("Number of apples: {0}", resultByType[typeof(Apple)].Count()); Console.WriteLine("Number of baskets with apples: {0}", resultByType[typeof(Apple)].Distinct().Count()); Console.WriteLine("Number of bananas: {0}", resultByType[typeof(Banana)].Count()); Console.WriteLine("Number of baskets with bananas: {0}", resultByType[typeof(Banana)].Distinct().Count()); }