edit2
При работе с вложенными типами, например, с помощью new {r, r.childrenCollection}, LINQ преобразует это в (SELECT TOP 100 FROM r), удаляя информацию о соединении. При самостоятельном соединении этого не происходит. Так что-то вроде:
var thingyWithChilds
= (from p in dc.RightCategories
join r in dc.Rights on p.Id equals r.CategoryId
select new { p.Id, r });
var bla = thingyWithChilds.Take(100);
не вызовет той же проблемы.
другие вещи, которые могут применяться
Вы выполняете ToArray (), который вызывает выполнение запроса, поскольку он не является IQueryable. Просто выполните ToArray () после выполнения Take ().
edit Согласно этой теме SO: Существует ли LINQ-эквивалент строки. Join (string, string []) , невозможно использовать String.Join, если вы хочу сделать все на сервере, так как в TSQL для этого нет команды SQL.