2017-12-22 45 views
1

私は次の2つの表(スキーマを簡素化)したデータを取得:デバイスがされていないSIMカードを使用することができますので流暢NHibernateのマッピングは、()レイジーロードを無効にし、誤っ

Device 
    Id, IMSI, ... 

SIM 
    IMSI, PhoneNumber, ... 

References(x => x.Sim).Column("IMSI").NotFound.Ignore();

これは私がすべてのデバイス(数千)とメモリ使用量の空が急上昇返すクエリを書いたまで期待通りに働いていた:SIM表IはDevice.Mapクラスで、次の流暢NHibernateのマッピングを使用しています。

joinを使用して1つのクエリを生成する代わりに、SQLプロファイラが示したものです。 Nhibernateは1つのクエリを生成してすべてのデバイスを取得し、その後数千のクエリを生成して各デバイスのSIMを取得しました。

マッピングでFetch.Join()を追加しようとしましたが、同じ結果が得られました。

私はNhibernateが左の結合で単一のクエリを生成し、同じ結果を得ることができるはずだと思います。しかし、私はそれを行う方法を見つけることができませんでした。どんな助けもありがとう。このクエリでは

答えて

0

var devices = session.Query<Device>() 
    .Fetch(x => x.Sim) 
    .ToList(); 

あなたが望むものを(ほぼ)取得します。

NHibernateのは、テーブル間LEFT OUTER JOINを生成するが、それでも対応SIMなしDeviceための別SELECTを生成します。

+0

ありがとうございました。左結合が機能しました。しかし、別のクエリはここで本当のキラーです。私はマッピングのNotFound.Ignoreが起こるのを防ぐべきだと思うだろうが、明らかにそうではない。 – Robert

関連する問題