我正在创建一个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