NHibernate扩展限制

本文关键字:扩展 NHibernate | 更新日期: 2023-09-27 18:11:21

我需要扩展Like限制来支持重音不敏感,但我不知道在哪里修补。有人知道我是怎么做的吗?我不能更改所有客户数据库中的排序,我正在使用标准,不能更改这一点,因为我创建了一个在我的领域中包装标准的基础结构。

NHibernate扩展限制

方法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是什么,然后我为它创建自定义表达式。

我的代码在这里:源代码