OriginalGriff
Попробуй:
DataTable dt1 = new DataTable();
dt1.Columns.Add("Id");
dt1.Columns.Add("Name");
dt1.Rows.Add(1, "x");
dt1.Rows.Add(2, "y");
dt1.Rows.Add(3, "z");
DataTable dt2 = new DataTable();
dt2.Columns.Add("Id");
dt2.Columns.Add("TableId");
dt2.Columns.Add("Date");
dt2.Rows.Add(1, 1, new DateTime(2017, 5, 1));
dt2.Rows.Add(2, 1, new DateTime(2017, 5, 2));
dt2.Rows.Add(3, 1, new DateTime(2017, 5, 3));
dt2.Rows.Add(4, 2, new DateTime(2017, 5, 2));
dt2.Rows.Add(5, 2, new DateTime(2017, 6, 2));
var y = dt2.AsEnumerable().GroupBy(g => g["TableId"]).Select(g => new {Id = g.Key, Date = g.Max(m => m["Date"])});
var x = from d1 in dt1.AsEnumerable()
join d2 in y
on d1["Id"] equals d2.Id
select new { Name = d1["Name"] as string, Date = d2.Date };