class Program { static void Main(string[] args) { var listTest1 = new List<Test1> { new Test1{Key="1",Name="1"}, new Test1{Key="2",Name="2"}, new Test1{Key="3",Name="3"} }; var listTest2 = new List<Test2> { new Test2{SubKey="sub1",SubName="sub1",MainKey="1",}, new Test2{SubKey="sub2",SubName="sub2",MainKey="2"}, new Test2{SubKey="sub3",SubName="sub3",MainKey="2"} }; var result = from t1 in listTest1 join t2 in listTest2 on t1.Key equals t2.MainKey select new TestResult(t1, t2); result = result.ToList(); Console.WriteLine(result); Console.ReadKey(); } } public class Test1 { public string Key { get; set; } public string Name { get; set; } } public class Test2 { public string SubKey { get; set; } public string SubName { get; set; } public string MainKey { get; set; } } public class TestResult { public string Name { get; set; } public string SubName { get; set; } public TestResult(Test1 t1, Test2 t2) { this.Name = t1.Name; this.SubName = t2.SubName; } }