我想使用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);
}
}
}
答案 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服务器的本地时间而不是客户端计算机。