Создание одного туда-обратно против трех будет действительно более эффективным. Вопрос в том, стоит ли беспокоиться. Весь набор инструментов и фреймворков ADO.Net и C # 3.5 противостоят тому, что вы пытаетесь сделать. TableAdapters, Linq2SQL, EF, все они любят иметь дело с простой семантикой одного вызова == одного результата. Таким образом, вы можете потерять некоторую серьезную производительность, пытаясь превратить Framework в представление.
Я бы сказал, что если у вас нет каких-либо серьезных измерений, показывающих, что вам нужно уменьшить количество поездок туда и обратно, воздержитесь. Если вы делаете , в конце концов, требуется это, то используйте хранимую процедуру, чтобы хотя бы дать семантику API-типа.
Но если ваш запрос действительно соответствует тому, что вы опубликовали (т. Е. Выберите всех пользователей, всех команд и всех разрешений), то у вас, безусловно, будет гораздо большая рыба жарить перед тем, как уменьшить количество циклов ... сначала уменьшите наборы результатов.