【问题标题】:Nhibernate select datepart休眠选择日期部分
【发布时间】:2026-01-13 04:00:02
【问题描述】:

我需要在不同的数据库上下文中使用这个 SQL 字符串,我知道它可以在 MSSQLCE4 中工作,但它不会在 MySql 中工作

sql = session.CreateSQLQuery(
    "SELECT DISTINCT DATEPART(yyyy," + DataRicezioneFile + ") AS Data" +
    " FROM " + Ricevuta + 
    " ORDER BY Data DESC"
);

所以我在 Nhibernate 中使用 QueryOver 编写了相同的代码

list = session.QueryOver<Ricevuta>()
       .Select(
           Projections.Distinct(Projections.SqlFunction( "year", NHibernateUtil.Int32,
           Projections.Property<Ricevuta>( r => r.DataRicezioneFile )
       )))
       .OrderBy(r=>r.DataRicezioneFile).Desc
       .List<int>().ToList();

现在这项工作在 MySql 但不在 MSSQLCE4 中工作,我想是因为使用 YEAR(DateTime) 而不是 DATEPART(yyyy,DateTime)

我不知道如何让函数独立于数据库引擎工作。有什么想法吗?

【问题讨论】:

    标签: mysql nhibernate sql-server-ce datepart


    【解决方案1】:

    你可以试试 Nhibernate Linq 吗?

    因为我已经使用 Nhibernate Linq 完成了这些字符串操作和日期操作

    【讨论】:

      【解决方案2】:

      好吧,感谢@Sebin 建议使用 Nhibernate Linq,我发现这在我的测试用例和其他许多测试用例中都有效

      List<DateTime> tmpList = session.Query<Ricevuta>()
                                   .Select( x => x.DataRicezioneFile )
                                   .Distinct()
                                   .ToList();
      
      list = tmpList.OrderByDescending(x=>x.Year)
                                   .Select(x=>x.Year)
                                   .Distinct()
                                   .ToList<int>();
      

      对于完整的答案,是否可以对完整的 linq 查询执行相同的操作:

      var query = from ric in session.Query<Ricevuta>()
                  select ric.DataRicezioneFile;
      List<DateTime> tmpList= query.ToList();
      list = tmplist.OrderByDescending( x => x.Year ).Select( x => x.Year ).Distinct().ToList<int>();
      

      在这两种情况下都需要使用 DateTime 的 tmpList,因为使用直接 DateTime.Year 请求在不同的 DBM 上的工作方式不同。

      【讨论】: