【问题标题】:Truncate DateTime in NHibernate QueryOver SelectGroup在 NHibernate QueryOver SelectGroup 中截断 DateTime
【发布时间】:2011-07-06 00:56:31
【问题描述】:

我有一个相当普通的 QueryOver 查询,其中包含以下内容,

.SelectList(list => list
    .SelectGroup(() => txn.GroupField)
    .SelectGroup(() => txn.Date))
.List<object[]>()

此查询按预期工作,但是我现在需要按截断的日期进行分组,因为这些对象的某些日期可能包含时间组件。这似乎应该是一个微不足道的改变,但我找不到 NHibernate 支持的方法。

明显的解决方案是下面的更改,但不受支持。

.SelectGroup(() => txn.Date.Date))

有什么想法吗?

谢谢

【问题讨论】:

    标签: nhibernate datetime group-by truncate queryover


    【解决方案1】:

    您的QueryOver 可能如下所示:

    Status alias = null;
    var query = QueryOver.Of(() => alias)
        .Select(Projections.GroupProperty(
            Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property(() => alias.Date))));
    

    输出(伪sql):

    SELECT 
               ...
    FROM       [Status] this_
    GROUP BY   dateadd(dd, 0, datediff(dd, 0, this_.Date))
    

    希望这会有所帮助,干杯!

    【讨论】:

    • 非常感谢,MonkeyCoder。我尝试将 SelectList()/.SelectGroup() 与 Projections 一起使用,但失败了。
    【解决方案2】:

    您可能希望使用公式命令向地图添加一个辅助属性,以便能够在查询中使用日期(而不是日期时间)。

    这是我的代码中的一个示例;它使用十进制值,但这适用于任何子查询:

    模型类有这个属性,可以映射到公式:

    public virtual decimal Profit
    {
        get { return this.SellPrice - this.Cost; }
        set { return; }
    }
    

    fluentNHibernate 地图:

    //SellPrice and Cost are columns in the object's table
    Map(v => v.Profit).Formula("(SellPrice - Cost)"); // this field is calculated, not read
    

    请务必将公式放在 () 括号之间。

    如果您将公式设为将日期时间转换为日期的选择查询,则可以在查询中按该属性进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多