将条件属性添加到FluentNHibernate ClassMap?

时间:2012-02-02 17:52:54

标签: nhibernate fluent-nhibernate

我想使用FluentNhibernate为NHibernate实体添加条件属性进行映射。我还想在我的搜索条件中通过此属性订购。

我有一份合同清单,我希望根据合同中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 个答案:

答案 0 :(得分:3)

是的。您可以将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");
        }
    }
}

此公式显然是get-only,但必须设置为字段或属性(强制您使用public getter和setter定义所述字段或属性,除非使用其他一些技巧来设置私有支持字段)。在这种特定情况下,您可能最好在属性获取器中定义此逻辑,除非您需要在查询中使用此计算,或者您需要DB服务器的本地时间而不是客户端计算机。