0

この 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 では機能しません。おそらく、DATEPART(yyyy,DateTime) の代わりに YEAR(DateTime) を使用しているためです。

関数をデータベース エンジンから独立して動作させる方法がわかりません。何か案が?

4

2 に答える 2

1

Nhibernate Linq を試すことができますか?

Nhibernate Linq を使用してこれらの種類の文字列操作と日付操作を行ったので

于 2013-06-25T11:24:00.500 に答える
0

さて、Nhibernate Linq を使用するという @Sebin の提案のおかげで、これが私のテストケースとうまくいけば他の多くのケースの両方で機能することがわかりました

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 に答える