我想在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)")
,但我不知道正确的投影语法,以使其有效。
答案 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%'