2011-02-09 3 views
0

Я создаю запрос 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 

У меня есть два основных вопроса:

  1. Почему это?
  2. Как это предотвратить?

Спасибо!

+0

Как ваше отображение выглядеть? –

ответ

1

Если это не ошибка пасты копии &, вы используете другое свойство (MatchingUser) от одного вы сгружен (Пользователь)

+0

Серьезно, вы не представляете, насколько глупо это заставляет меня чувствовать :-) Это заняло у меня 2 часа моего времени вчера. Спасибо, что прочитали мой пост в деталях. – Razzie

+0

Мы все были там :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^