Я бы предложил кэшировать результаты. Казалось бы, достаточно просто заполнить кэш ASP.NET , и тогда, пока ваш запрос имеет достаточно приличную производительность, вам нужно будет запускать его только один раз для пользователя.
Учитывая, что попадание в базу данных в любом случае дорого, кэширование результатов здесь поможет, даже если у вас есть хороший запрос.
В противном случае вы можете посмотреть на реструктуризацию базы данных, чтобы не требовать CTE, возможно, более простой структуры или индексированного представления, которое имитирует более простую структуру.