Създавам HQL заявка, която използва нетърпеливо извличане за някои колекции и свойства. Това е запитването:
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
}
... и няма да удари отново базата данни.
Потребителският обект обаче има свойство, което не е картографирано към базата данни, IsOnline. Това прави някои изчисления, използвайки текущата дата. Веднага след като използвам това свойство в израз, базата данни ще бъде засегната. Например:
int i = result.Count(m => m.MatchingUser.IsOnline);
... ще удари базата данни за всеки потребител, в моя случай 10 пъти, използвайки тази заявка:
SELECT * FROM `User` user0_ WHERE user0_.Id =? p0
Имам два основни въпроса:
- Защо е това?
- Как да предотвратя това?
Благодаря!