我需要扩展Like限制以支持重音不敏感,但我不知道在哪里修补。谁知道我是怎么做到的?我无法在所有客户数据库中更改整理,并且我正在使用条件,因此无法更改此内容,因为我创建了一个在我的域中包装标准的基础结构。
答案 0 :(得分:0)
您可以使用SQL表达式执行此操作,即
Expression.Sql(
"your_field COLLATE Latin1_general_CI_AI LIKE ? COLLATE Latin1_general_CI_AI",
String.Format("%{0}%", your_field),
NHibernateUtil.String)
有关详细信息,请参阅my answer类似问题。 另请参阅this question的答案,了解有关正确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
Can I customize collation of query results in nHibernate?
希望这有帮助。
答案 1 :(得分:0)
我解决了我的问题,创建了一个自定义标准,我检查方言以确定NHibernate正在使用的RDBMS,然后我创建自定义表达式。
我的代码在这里:source code