TL; DR:NHibernateはQueryOverクエリをSQLに変換します。次の式をSQLに変換する方法はわかりません:
Select(x => x.DateTime.ToString("dddd dd MMMM yyyy",ci))
これは、エラーが発生する理由です。あなたは、いくつかのオプションがあります。
を希望する日付形式を取得するために、結果にいくつかの後処理を行います。これは最も簡単な修正方法です。
var dates = session.QueryOver<Date>()
.Where(x => x.IsVisible != 0)
.SelectList(lst => lst
.Select(x => x.Id)
.Select(x => x.DateTime))
.List<object[]>()
.Select(o => new DateDTO
{
Id = (int)o[0],
Date = ((DateTime)o[1]).ToString("dddd dd MMMM yyyy", ci)
});
は、データベース側で日付をフォーマットするカスタムSQL関数を書く:あなたはこのような何かを書くことができます。これはもう少し作業ですが、最終結果は少しきれいに見えるかもしれません。この実装はSQLの方言に依存します。この例では、SQL Server 2014で利用でき、FORMAT
機能を使用しています。
ISQLFunction formatFunction =
new SQLFunctionTemplate(NHibernateUtil.String, "FORMAT(?1, 'dddd dd MMM yyy', 'he-IL')");
DateDTO dateDto = null;
session.QueryOver<Date>()
.Where(x => x.IsVisible != 0)
.SelectList(lst => lst
.Select(x => x.Id).WithAlias(() => dateDto.Id)
.Select(Projections.SqlFunction(
formatFunction,
NHibernateUtil.String,
Projections.Property<Date>(x => x.DateTime))
).WithAlias(() => dateDto.Date))
.TransformUsing(Transformers.AliasToBean<DateDTO>())
.List<DateDTO>()
.Dump();
これは、次のSQLを生成:NHibernateの方言は、あなたがしている場合
SELECT
this_.Id as y0_,
FORMAT(this_.DateTime, 'dddd dd MMM yyy', 'he-IL') as y1_
FROM
Date this_
WHERE
not (this_.IsVisible = @p0);
をあなたも、カスタム関数を作成する必要はありません使用すると既にサポートされています。
あなたは、そのルートに行くことに興味があるなら、クエリの中でSQL関数を使うことについて約blog postです。 (全開示:これは私の個人的なブログです)。
「ToString」をQueryOverクエリの内部で呼び出すことはできません。クエリが戻った後に、SQL式を使用したり、日付を書式設定することができます。 –