0

我的目标是从连接在一起的两个表中获取两个值并执行比较,如果为真,则输出表 1 中的行。下面的 TSQL 代码说明了查询,问题是是否有办法在 where 中执行第三个谓词使用 NHibernate 条件的子句使用 session.CreateCriteria:

declare @currentSystemTime datetimeoffset = '2015-07-22 18:42:16.1172838 +00:00'
select 
    inst.ExpiryDate, 
    ent.DaysToExpiryNotificationStart, 
    convert(date, dateadd(day, -ent.DaysToExpiryNotificationStart, inst.ExpiryDate)) as NotificationStart, 
    convert(date, @currentSystemTime) as CurrentSystemTime, 
    * 
from 
    Instances inst
    inner join Entries ent on inst.Entry_id = ent.Id
where
    inst.ExpiryDate is not null
    and ent.DaysToExpiryNotificationStart is not null
    and convert(date, @currentSystemTime) >= convert(date, dateadd(day, -ent.DaysToExpiryNotificationStart, inst.ExpiryDate))

实体类中的属性定义如下:

public virtual DateTimeOffset? ExpiryDate { get; set; }
public virtual int? DaysToExpiryNotificationStart { get; set; }

我正在使用 Fluent NHibernate 来映射这些。通过 CreateQuery 或 CreateSQLQuery 进行手动查询是唯一的方法吗?如果有更简单的方法来完成这项任务,我很乐意。任何帮助将不胜感激。

谢谢,肖恩

4

1 回答 1

1
session.Query<Instances>()
    .Where(i => Datetime.Today >= i.ExpiryDate.AddDays(i.DaysToExpiryNotificationStart))

adddays 尚未原生支持,但可以很容易地添加。请参阅此处以使 AddDays 工作

可以使用 QueryOver 完成相同的稍微不同的操作

session.QueryOver<Instances>()
    .Where(i => Datetime.Today >= i.ExpiryDate.AddDays(i.DaysToExpiryNotificationStart))

public static class QueryOverExtensions
{
    public static void Register()
    {
        ExpressionProcessor.RegisterCustomProjection(() => default(DatTime).AddDays(1), QueryOverExtensions.ProcessAddDays);
    }

    private static IProjection ProcessAddDays(MethodCallExpression methodCallExpression)
    {
        IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
        return (Projections.SqlFunction("addDays", NHibernateUtil.DateTime, NHibernateUtil.Int32, property));
    }
}

注意:我不确定 adddays 是否已经定义为 sql 函数。您可能需要在驱动程序中注册一个

于 2013-08-05T06:04:23.683 回答