Я создаю запрос HQL, который использует нетерпеливые выборки для некоторых коллекций и свойств. Это запрос:NHibernate - eager fetch collection
var result = Session.CreateQuery("from Match m left join fetch m.User u left join fetch u.ProfileItems pi where m.User.Id = :p1")
.SetParameter("p1", user.Id)
.List<Match>().ToList();
Это хорошо работает. Используя NHProfiler, я вижу, что он производит следующий SQL-запрос:
select (...) from `Match` match0_
left outer join `User` user1_
on match0_.UserId = user1_.Id
left outer join `ProfileItem` profileite2_
on user1_.Id = profileite2_.User_id
where match0_.UserId =? p0
Теперь я могу перебирать результат Match
экземпляров или даже User
случаях, как это:
foreach (User u in result.Select(m => m.User))
{
// .. do something
}
... и он больше не попадет в базу данных.
Однако объект User имеет свойство, которое не отображается в базу данных IsOnline. Это делает некоторые вычисления с использованием текущей даты. Как только я использую это свойство в выражении, база данных будет удалена. Например:
int i = result.Count(m => m.MatchingUser.IsOnline);
... ударит базу данных для каждого пользователя, в моем случае 10 раз, используя этот запрос:
SELECT * FROM `User` user0_ WHERE user0_.Id =? p0
У меня есть два основных вопроса:
- Почему это?
- Как это предотвратить?
Спасибо!
Как ваше отображение выглядеть? –