NHibernate 如何将此 SQL 查询转换为 QueryOver 或 Linq

标签 nhibernate queryover

我真的可以使用一些关于如何将这个 sql 查询带到 NHibernate QueryOver 的指导。我尝试使用 Linq,因为我对 Linq 比较熟悉。我们正在开展的项目正在使用 QueryOver,因此现在最好保持这条路线。

工作 SQL 查询:将 DateTime 舍入为 1 分钟并正确分组/排序/计数...

select dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0), COUNT(*)
from PartData
group by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0)
order by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0)

返回预期结果:
2012-08-31 00:00:00.000, 3
2012-08-31 00:01:00.000, 4
2012-08-31 00:02:00.000, 3
2012-08-31 00:03:00.000, 3
2012-08-31 00:04:00.000, 4
2012-08-31 00:05:00.000, 3
2012-08-31 00:06:00.000, 3
2012-08-31 00:07:00.000, 4
2012-08-31 00:08:00.000, 3

编辑

我越来越近了...
private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session)
{
    return session.QueryOver<entities.PartData>()
        .Select(
            Projections.Alias(
                Projections.GroupProperty(
                    Projections.SqlFunction(
                        new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(mm,1,Date)"),
                        NHibernateUtil.DateTime, _partsDate))
                , "Date"),
            Projections.Alias(Projections.RowCount(), "Count"))
                .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>());
}

产生以下 SQL:
SELECT DateAdd(mm,1,dateTimeColumn), count(*)
FROM [PartData] 
GROUP BY DateAdd(mm,1,dateTimeColumn)

只需要弄清楚如何在那里获取 datediff :)

最佳答案

凭借坚持的力量,我成功地赢得了这场战斗。这是我对上述 SQL 查询的 QueryOver ......我相信我已经在这个 NHibernate 事情中转过弯:)

非常感谢任何改进或替代方法来重新产生预期结果的建议。

private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session)
{
    return session.QueryOver<entities.PartData>()
        .Select(
            Projections.Alias(
                Projections.GroupProperty(
                    Projections.SqlFunction(
                        new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(minute," +
                                                                         new SQLFunctionTemplate(
                                                                             NHibernateUtil.DateTime,
                                                                             "(DateDiff(minute, 0, Date)/1)*1") +
                                                                         ",0)"),
                        NHibernateUtil.DateTime, _partsDate))
                , "Date"),
            Projections.Alias(Projections.RowCount(), "Count"))
        .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>());
}

关于NHibernate 如何将此 SQL 查询转换为 QueryOver 或 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12230327/

相关文章:

NHibernate:一次插入多个项目

NHibernate QueryOver、投影和别名

NHibernate 使用 Linq 或 QueryOver 将子实体投影到父属性中

asp.net-mvc - 温莎 + NHibernate + ISession + MVC

NHibernate - NHibernate 是否识别对象相等并相应地更改保存行为?

c# - 有没有办法让 NHibernate 将字符串键视为不区分大小写?

c# - 在 EntityFramework 和 NHibernate 之间切换

nhibernate - 从父集合中查询子集合

nhibernate - 使用 NHibernate QueryOver 过滤和投影关联

使用 SQL 函数值从 SQL 到 NHibernate 查询