代码之家  ›  专栏  ›  技术社区  ›  Scott Muc

使用自连接和NHibernate标准API查询覆盖实体

  •  1
  • Scott Muc  · 技术社区  · 17 年前

    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写这个,没问题。

    1 回复  |  直到 17 年前
        1
  •  0
  •   Nathan Baulch    15 年前

    我最终粗暴地强迫别人解决问题。这并不漂亮,但因为我知道表很小(可能最终只有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;
        }
    }