Для меня это выглядит так:
var query = from row in tableOuter
group row by new { row.Name, row.Id } into g
where !tableInner.Any(inner => inner.Reference == g.Key.Id)
select g.Key.Name;
Хотя у меня будет соблазн выполнить фильтрацию перед группировкой - в этот момент вы можете просто сгруппировать имя строки:
var query = from row in tableOuter
where !tableInner.Any(row => inner.Reference == row.Id)
group row.Name by new { row.Name, row.Id };
Я думаю , что должно делать то же самое, верно?