【发布时间】:2011-06-24 04:26:04
【问题描述】:
我正在创建一个 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
}
...它不会再次访问数据库。
但是,User 对象有一个未映射到数据库的属性 IsOnline。这会使用当前日期进行一些计算。一旦我在表达式中使用这个属性,数据库就会被命中。例如:
int i = result.Count(m => m.MatchingUser.IsOnline);
... 将使用此查询为每个用户访问数据库,在我的情况下为 10 次:
SELECT * FROM `User` user0_ WHERE user0_.Id =? p0
我有两个主要问题:
- 这是为什么呢?
- 如何防止这种情况发生?
谢谢!
【问题讨论】:
-
你的映射是什么样子的?