Nhibernate选择datepart

时间:2013-06-25 10:33:39

标签: mysql nhibernate sql-server-ce datepart

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

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

所以我使用QueryOver

在Nhibernate中编写了相同的内容
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)

我无法找到如何让函数独立于数据库引擎。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你能试试Nhibernate Linq吗?

因为我使用Nhibernate Linq进行了这种字符串操作和日期操作

答案 1 :(得分:0)

好吧,多亏了@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上的工作方式不同。