2

DateTime 列を検索できるように、SQL Server 2008 の Convert 関数を利用したいと考えています。

提案された SQL は次のようになります。

SELECT (list of fields) FROM aTable
WHERE CONVERT(VARCHAR(25), theColumn) LIKE '%2009%'

convert の呼び出しをエミュレートしようとする条件の一部を次に示します。

Projections.SqlFunction("CONVERT", 
  NHibernateUtil.String, 
  Projections.Constant("varchar(25)"), 
  Projections.Property(searchCol))

検索列は動的に選択されるため、クエリでハードコーディングすることはできません。

問題は、SQL が nhibernate によって生成されるとき、データ型を文字列として渡すときに、その周りに引用符があってはならないことです。

したがって、生成された sql は次のようになります。

(convert(@p3, this_.theColumn) LIKE @p4

必要な場合:

(convert(varchar(25), this_.theColumn) LIKE @p4

私は間違いなく問題があると確信してProjections.Constant("varchar(25)")いますが、それを機能させるための正しい射影構文がわかりません。

4

1 に答える 1

3

(そして、私はあなたができると確信しています)CASTの代わりに受け入れることができれば、より簡単な解決策があります。CONVERT

「SQL Server 関連」関数を呼び出す代わりに、抽象化を呼び出しましょう。これは、ほとんどの DB サーバーで動作するはずです(サポートされている NHibernate dilacts に基づく)。

Projections.Cast(NHibernateUtil.String, Projections.Property(searchCol))

したがって、句でRestriction使用されるは次のWHEREようになります。

Restrictions
    .Like (
        Projections.Cast(NHibernateUtil.String, Projections.Property(searchCol))
        , "2009"
        , MatchMode.Anywhere
    )

そして、SQL Server 方言を使用して NHibernate によって生成された結果は次のようになります。

WHERE cast( this_.theColumn as NVARCHAR(255)) like @p1 ... @p1=N'%2009%'
于 2013-09-19T02:53:45.380 に答える