2011-02-09 121 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