2011-02-09 69 views
0

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

我有两个主要问题:

  1. 为什么是这样?
  2. 我该如何预防?

谢谢!

+0

请问你的映射看起来像一个不同的属性(MatchingUser)? – 2011-02-09 14:26:50

回答

1

除非它是一个复制粘贴&错误,您正在使用从一个你获取(用户)

+0

说真的,你不知道这让我感觉多么愚蠢:-)这花了我昨天2小时的时间。感谢您阅读我的文章。 – Razzie 2011-02-10 07:53:42