我需要在不同的数据库上下文中使用这个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)
我无法找到如何让函数独立于数据库引擎。有什么想法吗?
答案 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上的工作方式不同。