2009-05-27 68 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; 
    } 
}