我正在使用以下代码来动态过滤数据(我使用 MySQL 作为数据库引擎):
var filter = string.Empty;
if (!string.IsNullOrWhiteSpace(filterNumber))
{
filter = "t.Number LIKE :filterNumber";
}
var query = string.Format("SELECT t FROM Table t WHERE 1=1 AND {0} ORDER BY {1} {2}", filter, orderBy, orderDirection);
var q = Session.CreateQuery(query);
if (!string.IsNullOrWhiteSpace(filterNumber))
{
q.SetParameter<string>("filterNumber", "%" + filterNumber + "%");
}
q.SetFirstResult(offset);
q.SetMaxResults(limit);
return q.List<Table>();
(假设 , filterNumber
, orderBy
,orderDirection
和offset
是limit
方法的参数并且1=1
只是为了这个问题而添加的,所以查询总是有效的)
当 Number 是字符串(MySQL 中的 VARCHAR)列时它确实有效,但当它是日期时间或整数列时它不起作用。
对于 datetime 它会引发异常:
could not execute query […] Name:filterDate - Value:%2012%
并且内部异常是Specified cast is not valid
.
对于整数/浮点列,异常是:
could not execute query […] Name:filterPrice - Value:%100%
内部异常是Input string was not in a correct format
.
(Date
并且Price
是表中的另一列)
如何在日期/数字列上动态创建这样的 LIKE 查询?这种查询在 MySQL 中运行良好:
SELECT * FROM `Table` WHERE `Date` LIKE '%2012%'