using System.Collections.Generic;
public int Id { get; set; }
public string Name { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int GroupId { get; set; }
public Group Group { get; set; }
static void Main(string[] args)
var productIds = new List<int> { 0, 2, 3 };
IEnumerable<Group> groups = new[]
new Group { Id = 0, Name = "Food" },
new Group { Id = 1, Name = "Drinks" }
var food = groups.First();
var drinks = groups.Last();
Product CreateFood(int id, string name)
return new Product { Id = id, Name = name, Group = food, GroupId = food.Id };
Product CreateDrink(int id, string name)
return new Product { Id = id, Name = name, Group = drinks, GroupId = drinks.Id };
IEnumerable<Product> products = new[]
CreateDrink(1, "Coffee"),
CreateFood(2, "Chocolate"),
var result1 = productIds.Join(products, id => id, product => product.Id,
ProductName = product.Name,
GroupName = product.Group.Name
var random = new Random(Environment.TickCount);
foreach (var product in products)
product.GroupId = random.Next(5);
const string EmptyGroupName = "No Group";
.Join(products, id => id, product => product.Id, (id, product) => product)
.GroupJoin(groups, product => product.GroupId, group => group.Id,
(product, matchedGroups) => new
ProductName = product.Name,
GroupName = matchedGroups.FirstOrDefault()?.Name ?? EmptyGroupName
Console.WriteLine("2.1");
Console.WriteLine(string.Join(Environment.NewLine, result1));
Console.WriteLine("2.2");
Console.WriteLine(string.Join(Environment.NewLine, result2));