Добавить условное свойство в FluentNHibernate ClassMap? - PullRequest
0 голосов
/ 02 февраля 2012

Я хотел бы добавить условное свойство к сущности NHibernate, используя FluentNhibernate для сопоставления.Я также хотел бы заказать по этому свойству в моих критериях поиска.

У меня есть список контрактов, которые я хотел бы пометить как просроченные или нет, основываясь на передаче свойства EndDate в контракте.Что касается заказа, я бы хотел, чтобы истекшие контракты опустились в конец списка.

Мой желаемый результат в виде оператора T-SQL;

SELECT ID, BeginDate, EndDate, CASE WHEN EndDate > GETDATE() THEN 1 ELSE 0 END AS Expired
FROM myTable
ORDER BY CASE WHEN EndDate > GETDATE() THEN 1 ELSE 0 END;

Возможно ли это с FluentNHibernate?

Моя (очищенная) сущность;

namespace MyDomain.Entities
{
    public class MyEntity
    {
        // [ID] [int] IDENTITY(1,1) NOT NULL
        public virtual int ID { get; private set; }
        // [IsDeleted] [bit] NOT NULL
        public virtual bool IsDeleted { get; set; }
        // [BeginDate] [datetime] NOT NULL
        public virtual DateTime BeginDate { get; set; }
        // [EndDate] [datetime] NOT NULL
        public virtual DateTime EndDate { get; set; }
    }
}

Мое сопоставление для этой сущности;

namespace MyDomain.Mappings
{
    public class MyEntityMap : ClassMap<MyEntity>
    {
        public MyEntityMap ()
        {
            this.Table("myTable");
            this.Id(x => x.ID);
            this.Map(x => x.IsDeleted);
            this.Map(x => x.BeginDate);
            this.Map(x => x.EndDate);
        }
    }
}

1 Ответ

3 голосов
/ 02 февраля 2012

Да.Вы можете указать оператор CASE в виде формулы:

namespace MyDomain.Mappings
{
    public class MyEntityMap : ClassMap<MyEntity>
    {
        public MyEntityMap ()
        {
            this.Table("myTable");
            this.Id(x => x.ID);
            this.Map(x => x.IsDeleted);
            this.Map(x => x.BeginDate);
            this.Map(x => x.EndDate);
            this.Map(x=>x.HasExpired)
               .Formula("CASE WHEN EndDate > GetDate() THEN 1 ELSE 0 END");
        }
    }
}

Эта формула, очевидно, доступна только для получения, но должна быть задана в поле или свойстве (что заставляет вас определять указанное поле или свойство с помощью общедоступных методов получения и установки, если не использовать некоторые другие приемы для установки частного поля поддержки).В этом конкретном случае вам может быть лучше определить эту логику в получателе свойств, ЕСЛИ НЕ нужно использовать эти вычисления в запросе или вам нужно локальное время сервера БД вместо клиентского компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...