2012-02-16 18 views
2

で参照されるベースクラスのサブクラスに基づいてオブジェクトの選択私が持っている4クラス 人 動物(抽象ベース) (動物)を継承するクラスが含まれていますタイプの動物への参照を(持っています)犬(動物を継承する) 猫(継承する動物)(流暢)NHibernateは - クエリ

私は動物、犬、猫のDBテーブルを持っているので、私はテーブルごとのクラスマッピングを使用しています。

私がやりたいことは、犬を持つすべての人を選択し、可能であれば犬のクラスのフィールドでフィルタできるようにすることです。可能であれば、タイプセーフなコードでこれをすべて行い、できるだけ時間をかけてコードが破損するのを防ぐために、SQLや文字列を直接処理するのではないと思います。

これは(流暢な1.2)nhibernate(3.1)で可能ですか?誰かが私を正しい方向に向けることができますか?私のクエリは、説明されているより少し複雑ですが、それがその中心です。

また少し話題がありますが、どこにでもmappingSession.QueryOver()のすべてのメソッドの説明があります。そこには非常に多くのものがあり、いくつかは明白ですが、フェッチなどのようなものは、彼らがすべて何をしているのかがはっきりしていません。ちょうどセッションオブジェクトを使用して参照するために

--- EDITクラス---

public class Person 
{ 
    Animal pet; 
    public string Name; 
} 

public abstract class Animal 
{ 
    public int ID; 
    public string Name; 
} 

public class Dog : Animal 
{ 
    public string Color; 
} 

public class Cat : Animal 
{ 
    public string someOtherVal; 
} 

は、私は彼らがタイプ犬のペットを持っているすべての異なる人々の名前を取得したいと犬は茶色です。

それは私が最終的に望む最終的な質問ですが、私は簡単だと思っていたように犬を持つ人を始めようとしていましたが、それはそうではないようです。私が試した

私の元Querysは

Dog dog = null; 
      var test2 = session.QueryOver<Person>() 
       .Inner.JoinAlias(x=>x.Pet,()=> dog) 
       .Where(()=>dog != null) 
       .List(); 

だった私もそれに明確な名前を低減するための突起部を持っていたが、私はまだそれが犬と人だけに制限することができませんでした。ここで

答えて

0

は、あなたがこれを実現する方法の例です:

http://jameskovacs.com/2011/02/16/getload-polymorphism-in-nhibernate-3/

var animal = session.CreateCriteria<Animal>() 
        .Add(Restrictions.IdEq(dogId)) 
        .UniqueResult<Animal>(); 

ます。また、このような何かを試すことができ、私はそれが動作する100%わからないんだけど、あなたが与えることができます試してみてください:

var animal = session.CreateCriteria<Animal>() 
        .Add(Restrictions.On<Dog>(m=>m.Id == 1)) 
        .UniqueResult<Animal>(); 

これは役に立ちますか?

+0

私はいくつかの読書とテストを明日行うつもりですが、私はうまくいけば、仕事が完璧でなければ、私をうまく近づけることができると思います。唯一の問題は、私が持っているのはセッションであり、渡す人ではないが、おそらくドコが私にそれを明確にするだろう。 – Seer

+0

何か問題があれば教えてください。 –

+0

私はまだ問題があります。 Personオブジェクトをどこから取得していますか?それは人や動物である必要がありますか?また、m => m.Id == person.Idの部分は、投影や何かではないので、コンパイルエラーが発生します。 – Seer