我正在創建一個HQL查詢,它使用對某些集合和屬性的提前獲取。這是查詢:NHibernate - 渴望獲取集合
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
我有兩個主要問題:
- 爲什麼是這樣?
- 我該如何預防?
謝謝!
請問你的映射看起來像一個不同的屬性(MatchingUser)? – 2011-02-09 14:26:50