我需要扩展 Like 限制以支持对口音不敏感,但我不知道在哪里修修补补。有人知道我是怎么做到的吗?我无法更改所有客户数据库中的整理,并且我正在使用标准并且无法更改它,因为我创建了一个在我的域中包含标准的基础架构。
问问题
759 次
2 回答
0
我解决了创建自定义标准的问题,在该标准中我检查方言以确定 NHibernate 正在使用的 RDBMS 是什么,然后为它创建自定义表达式。
我的代码在这里:源代码
于 2013-05-04T05:02:06.070 回答
0
方法一
您可以使用 SQL 表达式执行此操作,即
Expression.Sql(
"your_field COLLATE Latin1_general_CI_AI LIKE ? COLLATE Latin1_general_CI_AI",
String.Format("%{0}%", your_field),
NHibernateUtil.String)
有关详细信息,请参阅我对类似问题的回答。另请参阅此问题的答案以获取有关正确 SQL 格式的详细信息。
当然,这仅限于特定的 DBMS,例如 SQL Server。
方法二
另一种方法是为系统将使用的每个 DBMS 子类化 NHibernate 方言,并向这些自定义方言中的每一个添加自定义函数。例如,
public class CustomMsSqlDialect : MsSql2005Dialect
{
public CustomMsSqlDialect()
{
RegisterFunction("accentinsensitivelike",
new SQLFunctionTemplate(NHibernateUtil.String,
"?1 COLLATE Latin1_general_CI_AI like ?2 collate Latin1_general_CI_AI"));
}
}
然后调用它使用类似
var user = session.CreateQuery("from User u
where accentinsensitivelike(u.name, :name)")
.SetParameter("name", name)
.UniqueResult<User>();
这具有跨多个 DBMS 工作的优势,但比第一种方法工作量要多得多。
欲知更多详情,请关注以下
http://blog.schuager.com/2009/06/case-sensitive-queries-in-nhibernate.html
我可以在 nHibernate 中自定义查询结果的排序规则吗?
希望这可以帮助。
于 2013-04-30T09:24:06.920 回答