2009-05-27 42 views
1

我有一個簡單的Waiver模型,我想進行一個查詢,返回所有未覆蓋的Waivers。使用自連接和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; } 
} 

這裏的地圖:

<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> 

現在,我想在我的倉庫裏的方法與簽名公衆的IList GetLatest()。出於某種原因,我很難用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; 
    } 
} 
相關問題