NHibernate - нетърпелив за събиране на колекция

Създавам 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

Имам два основни въпроса:

  1. Защо е това?
  2. Как да предотвратя това?

Благодаря!


person Razzie    schedule 09.02.2011    source източник
comment
Как изглежда вашето картографиране?   -  person Frederik Gheysels    schedule 09.02.2011


Отговори (1)


Освен ако не е грешка при копиране и поставяне, вие използвате различно свойство (MatchingUser) от това, което сте извлекли (User)

person Diego Mijelshon    schedule 09.02.2011
comment
Сериозно, нямате представа колко глупаво ме кара да се чувствам това :-) Това отне около 2 часа от времето ми вчера. Благодаря, че прочетохте публикацията ми в детайли. - person Razzie; 10.02.2011