using System.Linq;
class Person
{
public int Id;
public string Name;
}
class Address
{
public int Id;
public string Street;
}
class PersonAddress
{
public int PersonId, AddressId;
}
public class Program
{
public static void Main(string[] args)
{
var personList = new []
{
new Person { Id = 1, Name = "Pete" },
new Person { Id = 2, Name = "Mary" },
new Person { Id = 3, Name = "Joe" }
};
var addressList = new []
{
new Address { Id = 100, Street = "Home Lane" },
new Address { Id = 101, Street = "Church Way" },
new Address { Id = 102, Street = "Sandy Blvd" }
};
var relations = new []
{
new PersonAddress { PersonId = 1, AddressId = 101 },
new PersonAddress { PersonId = 3, AddressId = 101 },
new PersonAddress { PersonId = 2, AddressId = 102 },
new PersonAddress { PersonId = 2, AddressId = 100 }
};
var joined =
from par in relations
join p in personList
on par.PersonId equals p.Id
join a in addressList
on par.AddressId equals a.Id
select new { Person = p, Address = a };
foreach (var record in joined)
System.Console.WriteLine("{0} lives on {1}", record.Person.Name, record.Address.Street);
}
}
dXNpbmcgU3lzdGVtLkxpbnE7CgpjbGFzcyBQZXJzb24KewoJcHVibGljIGludCBJZDsgCglwdWJsaWMgc3RyaW5nIE5hbWU7Cn0KCmNsYXNzIEFkZHJlc3MKewoJcHVibGljIGludCBJZDsKCXB1YmxpYyBzdHJpbmcgU3RyZWV0Owp9CgpjbGFzcyBQZXJzb25BZGRyZXNzCnsKCXB1YmxpYyBpbnQgUGVyc29uSWQsIEFkZHJlc3NJZDsKfQoKcHVibGljIGNsYXNzIFByb2dyYW0KewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKCXsKCQl2YXIgcGVyc29uTGlzdCA9IG5ldyBbXQoJCXsKCQkJbmV3IFBlcnNvbiB7IElkID0gMSwgTmFtZSA9ICJQZXRlIiB9LAoJCQluZXcgUGVyc29uIHsgSWQgPSAyLCBOYW1lID0gIk1hcnkiIH0sCgkJCW5ldyBQZXJzb24geyBJZCA9IDMsIE5hbWUgPSAiSm9lIiB9CgkJfTsKCgkJdmFyIGFkZHJlc3NMaXN0ID0gbmV3IFtdCgkJewoJCQluZXcgQWRkcmVzcyB7IElkID0gMTAwLCBTdHJlZXQgPSAiSG9tZSBMYW5lIiB9LAoJCQluZXcgQWRkcmVzcyB7IElkID0gMTAxLCBTdHJlZXQgPSAiQ2h1cmNoIFdheSIgfSwKCQkJbmV3IEFkZHJlc3MgeyBJZCA9IDEwMiwgU3RyZWV0ID0gIlNhbmR5IEJsdmQiIH0KCQl9OwoKCQl2YXIgcmVsYXRpb25zID0gbmV3IFtdIAoJCXsKCQkJbmV3IFBlcnNvbkFkZHJlc3MgeyBQZXJzb25JZCA9IDEsIEFkZHJlc3NJZCA9IDEwMSB9LAoJCQluZXcgUGVyc29uQWRkcmVzcyB7IFBlcnNvbklkID0gMywgQWRkcmVzc0lkID0gMTAxIH0sCgoJCQluZXcgUGVyc29uQWRkcmVzcyB7IFBlcnNvbklkID0gMiwgQWRkcmVzc0lkID0gMTAyIH0sCgkJCW5ldyBQZXJzb25BZGRyZXNzIHsgUGVyc29uSWQgPSAyLCBBZGRyZXNzSWQgPSAxMDAgfQoJCX07CgoJCXZhciBqb2luZWQgPSAKCQkJCQlmcm9tIHBhciBpbiByZWxhdGlvbnMKCQkJCQlqb2luIHAgaW4gcGVyc29uTGlzdAoJCQkJCQlvbiBwYXIuUGVyc29uSWQgZXF1YWxzIHAuSWQKCQkJCQlqb2luIGEgaW4gYWRkcmVzc0xpc3QKCQkJCQkJb24gcGFyLkFkZHJlc3NJZCBlcXVhbHMgYS5JZAoJCQkJCXNlbGVjdCBuZXcgeyBQZXJzb24gPSBwLCBBZGRyZXNzID0gYSB9OwoKCQlmb3JlYWNoICh2YXIgcmVjb3JkIGluIGpvaW5lZCkKCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gbGl2ZXMgb24gezF9IiwgcmVjb3JkLlBlcnNvbi5OYW1lLCByZWNvcmQuQWRkcmVzcy5TdHJlZXQpOwoJfQp9Cg==