C# 日期列上的NHibernate类查询

C# 日期列上的NHibernate类查询,c#,sql,datetime,nhibernate,sql-like,C#,Sql,Datetime,Nhibernate,Sql Like,我使用以下代码动态过滤数据(我使用MySQL作为DB引擎): var filter=string.Empty; 如果(!string.IsNullOrWhiteSpace(filterNumber)) { filter=“t.Number LIKE:filterNumber”; } var query=string.Format(“从表t中选择t,其中1=1和{0}按{1}{2}排序”,过滤器,orderBy,orderDirection); var q=Session.CreateQuery(

我使用以下代码动态过滤数据(我使用MySQL作为DB引擎):

var filter=string.Empty;
如果(!string.IsNullOrWhiteSpace(filterNumber))
{
filter=“t.Number LIKE:filterNumber”;
}
var query=string.Format(“从表t中选择t,其中1=1和{0}按{1}{2}排序”,过滤器,orderBy,orderDirection);
var q=Session.CreateQuery(查询);
如果(!string.IsNullOrWhiteSpace(filterNumber))
{
q、 SetParameter(“filterNumber”、“%”+filterNumber+“%”);
}
q、 SetFirstResult(偏移量);
q、 SetMaxResults(限制);
返回q.List();
(假设
filterNumber
orderBy
orderDirection
offset
limit
是方法的参数,并且仅为了这个问题而添加了
1=1
,因此查询始终有效)

当Number是string(MySQL中的VARCHAR)列时,它可以工作,但当Number是datetime或integer列时,它不工作

对于datetime,它引发异常:
无法执行查询[…]名称:filterDate-值:%2012%
且内部异常为
指定的强制转换无效

对于整型/浮点型列,例外情况是:
无法执行查询[…]名称:filterPrice-值:%100%
内部异常是
输入字符串的格式不正确

Date
Price
是表中的另一列)

如何在日期/数字列上动态创建类似的查询?这种查询在MySQL中运行良好:

从'Table'中选择*,其中'Date'类似于'%2012%'

如果可以避免的话,在日期/数字中使用LIKE可能不是一个好主意。如果要匹配年份,则应使用year(alias.property)HQL函数(无需将查询转换为CriteriaAPI,因为这是HQL语法)和常规的equals运算符。或小于/大于

我怀疑SQL是通过自动转换到varchar来工作的,但是除非您真的需要模式匹配,否则我认为与使用日期提取或两者之间的转换相比,这种方法的性能要差得多


如果确实需要模式匹配,则应将日期/数字转换为字符串。

基于我在HQL中成功转换的@usr注释:

filter=“CAST(t.Date作为字符串)LIKE:filterDate”;

它对日期和数字都有效。

这就是你要找的吗@nieve我没有
Criteria
对象,也不知道如何将
IQuery
转换为它的Session.CreateCriteria方法。我只能建议您查看一下它,例如,在这里,在Ayende的博客上:将列强制转换为字符串,然后再在类似表达式中使用它。@usr This:
filter=“(string)t.Date LIKE:filterDate”不起作用(
引发了类型为“Antlr.Runtime.NoViableAltException”的异常。在第1行第46列附近
filterDate
已经是字符串。