2

私は次の2つのエンティティを持っているとしましょう。私はこのようなクエリを記述する際このNHibernate 3.2 linqクエリを最適化する方法

public class Foo { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string SomeProp {get;set;} 
    public virtual Bar Bar {get;set;} 
} 

public class Bar { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string Name {get; set;} 
} 

//Fluent Mappings 
public class FooMapping :ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Id (f => f.Id).GeneratedBy.Identity(); 
     Version(f => f.Version); 
     Map(f=> f.SomeProp).Column("fooprop1"); 
     References(f => f.Bar).Column("foobarid").Not.Null(); 
    } 
} 

public class BarMapping :ClassMap<Bar> 
{ 
    public BarMapping() 
    { 
     Id (b => b.Id).GeneratedBy.Identity(); 
     Version(b => b.Version); 
     Map(b => b.name).Column("barname"); 
    } 
} 

(私は不眠症のビットであることとし、メモリからこれを入力しています、任意のコードのタイプミスを許してください):

var query = from f in Session.Query<Foo>() 
      where f.Bar.Id == 5 
      select new {f.Id, f.SomeProp}; 

私はNHibernateのが発生していることに気づきますBarテーブルへの内部結合を持つsqlクエリを実行し、BarテーブルのIdにwhere句を指定します。 bar.id = 5が有効なバーIDであることを確認するためにこれが行われていると思われますか?

私の質問は、foo.foobaridカラムに対してfooテーブルだけを問い合わせるようにNHibernateに指示する方法です。このような何か:

SELECT f.id, f.prop1 FROM foo f WHERE f.foobarid = 5

あなたが提供することができます任意の洞察力のために事前にありがとうございます!

答えて

2

Linqについては、このような最適化は実装されていないようです(これは文書化されており、HQLで動作しています)。

しかし、回避策として比較のためにBarオブジェクトを使用できます。 session.load()はDBにヒットしないため、追加のパフォーマンスコストはありません。

var bar = Session.Load<Bar>(5); 
var query = from f in Session.Query<Foo>() 
      where f.Bar == bar 
      select new {f.Id, f.SomeProp}; 
+0

ありがとうございました!それは完璧に働いた!うまくいけば、NH-Linqの後のバージョンでこの最適化が使用されることを期待していますが、これは私のために今働いています。 – NYCChris

関連する問題