Опрос переопределяющих сущностей с помощью самостоятельного объединения и API критериев NHibernate - PullRequest
1 голос
/ 27 мая 2009

У меня есть простая модель отказа, и я хотел бы сделать запрос, который возвращает все отказы, которые не отменены.

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>

Теперь я хочу, чтобы в моем репозитории был метод с подписью public IList GetLatest () . По какой-то причине мне трудно реализовать это с помощью CriteriaAPI. Я могу написать это в T-SQL без проблем.

1 Ответ

0 голосов
/ 28 мая 2009

Я закончил грубым решением проблемы. Это не красиво, но так как я знаю, что таблица будет крошечной (вероятно, в итоге будет всего 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;
    }
}
...