使用Fluent NHibernate定义派生布尔属性

使用Fluent NHibernate定义派生布尔属性,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一节课 public class Account { public DateTime? StartDate {get;set;} public DateTime? EndDate {get;set;} public bool IsActive {get;set;} } IsActive属性定义为以下公式: .Formula(" StartDate < GETDATE() and (EndDate is NULL or EndDate > GetDate

我有一节课

public class Account {

   public DateTime? StartDate {get;set;}

   public DateTime? EndDate {get;set;}

   public bool IsActive {get;set;}

}
IsActive属性定义为以下公式:

.Formula(" StartDate < GETDATE() and (EndDate is NULL or EndDate > GetDate())")
.Formula(“StartDateGETDATE())”)
但是,当使用QueryOver查询IsActive==true的所有帐户时,我会得到一个错误,NHibernate无法执行SQL

NHibernate生成的SQL

...other criterias...
and this_.StartDate < GETDATE()
   and (this_.EndDate is NULL 
         or this_.EndDate > GetDate()) = 1
…其他标准。。。
而这个uu.StartDate
如何正确定义公式

公式是一种正确的方法,还是有一种完全不同的方法

更新:

  • 有没有一种方法可以在不改变底层数据库的情况下做到这一点

谢谢

将表格上的公式定义为。这也有利于在NHibernate之外工作,而无需复制公式逻辑。您需要通知您的NHibernate映射,它不应该试图通过将“Generated”设置为always来写入计算列

我认为这会起作用,但我没有用NHibernate测试它,以确保条件得到正确解释。您必须将LINQ查询用于此方法。您还可以使用扩展方法采取类似的方法

public class Account
{
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public bool IsActive
    {
        get { return AccountIsActive(this); }
    }

    public static readonly Func<Account, bool> AccountIsActive = a =>
        {
            var now = DateTime.Now;
            return (a.StartDate.HasValue && a.StartDate < now) && (!a.EndDate.HasValue || a.EndDate > now);
        };
}
公共类帐户
{
公共日期时间?开始日期{get;set;}
公共日期时间?结束日期{get;set;}
公共福利活动
{
获取{return AccountIsActive(this);}
}
public static readonly Func AccountIsActive=a=>
{
var now=DateTime.now;
返回(a.StartDate.HasValue&&a.StartDatenow);
};
}
用法:

var activeAccounts = session.Query<Account>()
                     .Where(a => Account.AccountIsActive(a))
                     .ToList();
var-activeAccounts=session.Query()
.Where(a=>Account.AccountIsActive(a))
.ToList();

在这种情况下,
公式应/必须返回
bool
。因此,我们可以用这种方式重新定义公式(SQL Serever语法):


我同意这个解决方案,但关于初始语句:不是正好相反吗?原始公式返回一个bool,它是SQL Server假装不存在的“隐藏”类型,我们需要将其转换为整数类型(通常是位)?事实上,初始语句返回:“NHibernate无法执行SQL”我想我不清楚。我的意思是你的陈述“在这种情况下,公式应该/必须返回布尔值”。但我认为它已经是bool了,您的解决方案(正确地)转换为整数类型。(是的,我在这里吹毛求疵。:)奥斯卡,请不要误会我!;)问题是在SELECT子句中不能有=或<或>。只有在有案例陈述的情况下。这个chars的意思类似于WHERE caluse。这在SELECT中是不允许的。我的建议将适用于select,where,甚至是order by。。。这有意义吗?
.Formula(@"
(
  CASE
    WHEN  StartDate < GETDATE() and (EndDate is NULL or EndDate > GetDate())
     THEN 1
     ELSE 0
  END
)
";
var query = session.QueryOver<Account>()
           .Where(a => a.IsActive == true);
var list = query.List<Account>();