2011-11-22 9 views
6

チーム - >アスリートの関係を与え、すべてのアスリートに質問します。何が 私は約fetch="Join"を誤解していますか?このマッピングにより、 チームが参加によってロードされる必要がありますか?アスリートを反復するとき、それはまだ チームを怠惰に読み込みます。NHibernate Joinフェッチ(種類)

<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

だから、反復するときに、 'アスリート 'ごとに'チーム'を取得するクエリが表示されます。私は、熱心なフェッチとは別に、マッピングが正しいことを意味しますか? –

+0

例外はありません。 @ GertArnoldはい、反復処理中は、すべての反復でチームに照会します。 – mxmissile

答えて

13

ザ・NHibernateはLINQのクエリはマッピングのフェッチ戦略を使用していないこのHBMを生産

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

。あなたは、このようなlinqクエリでFetch()する必要があります。

var session = factory.OpenSession(); 

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

マッピング・ドキュメントで定義されたフェッチ戦略が影響:GETを介し

  • 検索()または負荷()
  • アソシエーションがナビゲートされるときに暗黙的に起こる
  • 検索
  • ICriteriaは
  • を照会します
  • 副選択フェッチを使用するかどうかを問い合わせるHQLクエリ

出典:performance-fetching

+1

ありがとう...彼らのLinq実装はこのように不完全です。 – klkitchens