NHibernate - 使用Criteria API对整数列进行LIKE搜索的最简单方法是什么?

10

我正在尝试对一个整数列进行类似搜索,我需要做的是将该列转换为varchar,然后执行like搜索。这可行吗?使用Criteria API最简单的方法是什么?

var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
1个回答

24

如果Number是一个字符串,那么它将变得容易:

.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))

既然你有一个数字,NHibernate会检查这个数字的类型,如果你给它一个字符串,它会抛出异常。

不确定为什么NH团队没有提供一个带有对象参数和MatchMode参数的重载……

无论如何,你仍然可以像这样做:

.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))

编辑

关于别名:

(我找不到文档中有关此的说明,但以下是我的理解)

{alias} 返回 NH 最近的 CreateCriteria 中使用的别名。因此,如果你有:

session.CreateCriteria<User>("firstAlias")
       .CreateCriteria("firstAlias.Document", "doc")
       .Add(Expression.Sql("{alias}.Number like ?", "%2%",  
                           NHibernateUtil.String)).List<User>();

{alias}在这种情况下将是“doc”,因此您最终会得到:doc.Number。

因此,始终在需要使用别名的CreateCriteria之后使用{alias}。


非常好,谢谢。对于 SQL 表达式的别名,我使用了 "this_.Number",这样可以吗?我能保证 NHibernate 总是使用 this_. 吗? - Jon Erickson
因为我使用“wi”别名来创建我的标准 - session.CreateCriteria<WorkItem>("wi") - 但是我不能在SQL表达式中使用“wi.Number”,因为它会将其字面放入T-SQL中(如果这有意义的话)。 - Jon Erickson
在创建常规的查询调用中,“wi”实际上会被转换为发送到服务器的 T-SQL 中的“this_”。我已经在 SQL 表达式中加入别名,以便将其指定为“this_.Number”。 - Jon Erickson
@sirrocco - 哈哈,当你在 SQL 表达式中放置“{alias}”时,我以为你是指“在此处放置你为条件创建的别名”...我没有想到你实际上是要字面上输入“{alias}”。但这很完美,如果可以的话我会给你+10分,这对我帮助很大。 - Jon Erickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接