在nhibernate标准中使用内置的sql“转换”函数

时间:2013-09-18 14:40:06

标签: c# sql-server-2008 nhibernate nhibernate-projections

我想在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))

搜索列将被动态选择,因此无法在查询中进行硬编码。

问题是当nhibernate生成SQL时,它会将数据类型作为字符串传递,而不应该有任何引号。

所以生成的sql看起来像:

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

当它需要时:

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

我绝对肯定问题出在Projections.Constant("varchar(25)"),但我不知道正确的投影语法,以使其有效。

1 个答案:

答案 0 :(得分:2)

如果您接受CAST而不是CONVERT (而且我几乎可以肯定您可以),那么就会有更直接的解决方案。

不要调用“与SQL Server相关的”函数,而是调用抽象,这应该适用于大多数数据库服务器(基于支持的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%'