Специально, загрузка до 250 мегабайт данных в клиентскую память, кажется, не очень хорошая идея. Если у вас есть память, вы можете использовать LINQ to Object и сохранять обращения к базе данных.
Проблема в том, что ваши данные являются иерархическими, и вам нужно выбрать одну строку, проверить ее и извлечь освобожденные строки, и это вызывает так много циклических переходов.
Вы можете использовать отложенную загрузку, чтобы получать все больше и больше строк в память клиента во время выполнения вашей программы и выполнять все больше и больше запросов в памяти, когда рабочий набор стабилизируется. Но это поможет, только если к строкам обращаются несколько раз, а не только один или два раза.
Другим решением может быть создание рекурсивных представлений или хранимых процедур с использованием общих табличных выражений, которые извлекают отдельные строки на некотором расстоянии от заданной строки.