каждое отображение должно иметь ленивую загрузку с
в Node Map:
Map(x => x.EntityType).Not.LazyLoad();
в EnityType Map:
Map(x => x.Properties).Not.LazyLoad();
и так далее ...
Также см. NHibernate Eager, загружающий многоуровневые дочерние объекты для одноразовой загрузки
Добавлено:
Дополнительная информация по Sql N + 1:
SELECT DAY(updated_at), WEEK(updated_at), COUNT(*) AS visits
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year)
GROUP BY
DAY(updated_at), WEEK(updated_at) WITH ROLLUP
Это будет подсчитывать посещения в течение года, группируя их по дню, неделе и общему количеству.
Если вы просто хотите выбрать посещения на день, неделю и год по три столбцы, используйте это:
SELECT (
SELECT COUNT(*)
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 DAY)
) AS last_day,
(
SELECT COUNT(*)
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 7 DAY)
) AS last_week,
(
SELECT COUNT(*)
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
) AS last_year
Оператор SQL UNION http://www.w3schools.com/sql/sql_union.asp
Если вам нужно еще две строки, используйте UNION ALL. У вас все еще есть 3 запроса, но они выполняются как один.
Если вам нужно еще два столбца, используйте SUM ( CASE (...)). Обычно вы переходите от предложения WHERE к предложению CASE по 3 раза, каждое с собственным условием.
SELECT COUNT(updated_at) AS 'TODAY'
FROM parts_development.page_views day
INNER JOIN (SELECT COUNT(updated_at) AS 'WEEK', parts_user_id as userid
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 week)
GROUP BY parts_user_id) week
ON day.parts_user_id = week.userid
INNER JOIN (SELECT COUNT(updated_at) AS 'YEAR', parts_user_id as userweek
FROM parts_development.page_views p
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year)
GROUP BY parts_user_id) year
ON day.parts_user_id = year.userid
WHERE day.updated_at >= DATE_SUB(NOW(),INTERVAL 1 day)
GROUP BY day.parts_user_id
Не цитируйте мой синтаксис «ИНТЕРВАЛ», я не искал его, я сам являюсь парнем TSQL. Этого также можно добиться с помощью профсоюзов. Вы также можете заменить предложения where предикатами в соединениях.
как насчет
SELECT count(*), IsToday(), IsThisWeek()
FROM whatever
WHERE IsThisYear()
GROUP BY IsToday(), IsThisWeek()
, где функции Is * () являются логическими функциями (или выражениями)
Нет необходимости присоединяться или выполнять частичный выбор из таблицы более одного раза.
SELECT parts_user_id,
SUM( IF( updated_at >= DATE_SUB( NOW(), INTERVAL 1 DAY ), 1, 0 ) )
as day_visits,
SUM( IF( updated_at >= DATE_SUB( NOW(), INTERVAL 7 DAY ), 1, 0 ) )
as week_visits,
count(*) as year_visits
FROM parts_development.page_views
WHERE updated_at >= DATE_SUB( NOW(),INTERVAL 1 year )
GROUP BY parts_user_id