2011-11-22 41 views
6

給予團隊 - >運動員關係並詢問所有運動員。什麼 我誤解了fetch="Join"?這個映射是否應該通過連接加載團隊 ?當迭代運動員時, 仍然會延遲加載團隊。NHibernate加入提取(Kind)

public class AthleteMap : ClassMapping<Athlete> 
{ 
     public AthleteMap() 
     { 
      ManyToOne(a => a.Team, o => 
             { 
              o.Fetch(FetchKind.Join); 
              o.Lazy(LazyRelation.NoLazy); 
             } 
       );  
     }  
} 

將會產生這種HBM:

<class name="Athlete" table="Athletes"> 
    <id name="Id" type="Int32" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <many-to-one name="Team" fetch="join" lazy="false" /> 
    <property name="Created" /> 
</class> 

迭代:

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>()) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 
+0

你有例外嗎?至極? – Gerard

+0

所以當你迭代時,你會看到每個'運動員'獲取一個'Team'的查詢?我的意思是,除了渴望獲取之外,映射是正確的嗎? –

+0

沒有例外。 @GertArnold在迭代時是,它在每次迭代時都向團隊查詢。 – mxmissile

回答

13

NHibernate的LINQ查詢不使用映射的獲取策略。你必須像這樣在你的linq查詢中獲取()。

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>().Fetch(x => x.Team)) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 

在映射文檔中所定義的取策略影響:

  • 經由獲取檢索()或負載()
  • 檢索時的關聯之間進行導航這種情況發生隱式
  • 的ICriteria查詢
  • HQL查詢是否使用子選取提取

來源:performance-fetching

+1

謝謝...羞愧他們的Linq實現是不完整的,像這樣。 – klkitchens