Предполагая, что ваша реализация Linq2Sql имеет те же отношения в ней, что и база данных (что, если вы перетаскиваете в конструктор, они определенно имеют), вот как я бы подошел к ней.
Я бы создал строго типизированное частичное представление типа Agency, которое представляло бы каждый раздел (Agency, в вашем случае), назовите его AgencyReportSection.ascx. Этот контроль возьмет на себя агентство, перебирает свои бизнес-единицы, которые, в свою очередь, перебирают своих клиентов.
Где бы вы ни собирали данные, делайте что-то вроде этого:
DataContext context = new DataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Agency>(a => a.BusinessUnit);
options.LoadWith<BusinessUnit>(b => b.Client);
context.LoadOptions = options;
Что это даст вам, так это то, что когда контекст получает агентство, он будет следовать определенным отношениям и также предоставит вам эти объекты. Итак, вы получите:
Agency a = context.Agency.FirstOrDefault();
IEnumerable<BusinessUnit> units = a.BusinessUnits;
IEnumerable<Client> clients = units.Clients;
Ваш взгляд может сделать что-то вроде:
<% foreach(var agency in agencies)%{>
<% Html.RenderPartial("AgencyReportSection"); %>
<%}%>
Причина, по которой вы используете опцию загрузки данных, состоит в том, чтобы избежать отложенной загрузки в представлении, чтобы модель собрала все необходимые данные.
Надеюсь, я правильно понял ваш вопрос ...