2009-05-27 14 views
1

単純なWaiverモデルがあります。オーバーライドされていないWaiverをすべて戻す問合せを作成したいと考えています。セルフ・ジョインとNHibernate Criteria APIを使用したオーバーライド・エンティティの問合せ

public class Waiver 
{ 
    private readonly int id; 

    protected Waiver() 
    { 
     this.id = 0; 
    } 

    public virtual int Id { get { return id; } } 

    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual bool IsRequired { get; set; } 
    public virtual DateTime EffectiveDate { get; set; } 

    public virtual Waiver OverriddenWaiver { get; set; } 
} 

ここでマップです。)今、私は署名公共のIList GetLatest(と私のリポジトリ内のメソッドを持ちたい

<class name="Waiver" table="Music_Waivers"> 
    <id name="id" access="field" column="WaiverId" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <property name="Name" column="Name" /> 
    <property name="Description" column="Description" /> 
    <property name="IsRequired" column="IsRequired" /> 
    <property name="EffectiveDate" column="EffectiveDate" /> 

    <many-to-one name="OverriddenWaiver" class="Waiver" column="OverrideWaiverId" /> 
    </class> 

。なんらかの理由で、私はCriteriaAPIでこれを実装するのに苦労しています。私はこれをT-SQLで書くことができます。

答えて

0

私は解決策を強要しました。それはかなりではありませんが、私はテーブルが小さくなることを知っているので(おそらく5行にすぎません)、次のコードソリューションを考え出しました:

public IList<Waiver> GetLatest() 
{ 
    using (var session = SessionManager.OpenSession()) 
    {    
     var criteria = session.CreateCriteria(typeof (Waiver)); 
     var waivers = criteria.List<Waiver>(); 

     var nonOverridenWaivers = new List<Waiver>(); 

     foreach(var waiver in waivers) 
     { 
      bool overrideExists = waivers.Any(w => w.Overrides != null && 
                w.Overrides.Id == waiver.Id); 
      if (!overrideExists) 
       nonOverridenWaivers.Add(waiver); 
     } 

     return nonOverridenWaivers; 
    } 
} 
関連する問題