, поскольку вы вырезали свою работу для виджетов, для каждого виджета было бы правильно выполнить один запрос для всех его требуемых функций. Это также имело бы место, даже если вы извлекали виджеты через AJAX (что, как заметил cbp, неплохая идея).
Во-вторых, я бы настроил какой-то механизм для каждого виджета, чтобы зарегистрировать его существование, а затем, после регистрации всех виджетов, я бы запустил один запрос, который включал бы все запросы виджетов. (технически это снова несколько запросов, но в одном цикле, см. MulriCriteria и MultiQueries в справочнике NH).
Также не забывайте, что ленивые загрузки - это скрытые извлечения базы данных, и вы можете иметь огромное влияние на производительность, используя ленивую загрузку в ситуации, когда требуется энергичная нагрузка (например, Foo.Bar.Name, где вы всегда показываете Bar. Имя значения при представлении сущности Foo)
Снижение производительности может происходить даже при менее чем 20-30 вызовах базы данных на запрос, но это зависит от размера и сложности ваших объектов, запросов, фильтров, а также от размера полученных наборов данных.