2

我想使用 SQL Server 2008 中的 Convert 函数,以便可以搜索 DateTime 列。

建议的 SQL 看起来像这样:

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

以下是尝试模拟转换调用的部分标准:

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
    )

NHibernate 使用 SQL Server 方言生成的结果将是:

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