0

我需要在不同的数据库上下文中使用这个 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)

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

4

2 回答 2

1

你可以试试 Nhibernate Linq 吗?

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

于 2013-06-25T11:24:00.500 回答
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 上的工作方式不同。

于 2013-06-25T13:09:07.440 回答