NHibernate - 渴望获取一个集合

时间:2011-02-09 14:22:17

标签: nhibernate eager-loading

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

我有两个主要问题:

  1. 这是为什么?
  2. 如何防止这种情况?
  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

除非是复制和粘贴错误,否则您使用的是与您提取的属性不同的属性(MatchingUser)(用户)