NHibernate扩展限制
本文关键字:扩展 NHibernate | 更新日期: 2023-09-27 18:11:21
我需要扩展Like限制来支持重音不敏感,但我不知道在哪里修补。有人知道我是怎么做的吗?我不能更改所有客户数据库中的排序,我正在使用标准,不能更改这一点,因为我创建了一个在我的领域中包装标准的基础结构。
方法1
您可以使用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。
方法2
另一种方法是为系统将使用的每个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中定制查询结果的排序吗?
我解决了我的问题,创建了一个自定义标准,在那里我检查方言,以确定NHibernate使用的RDBMS是什么,然后我为它创建自定义表达式。
我的代码在这里:源代码