0

我需要扩展 Like 限制以支持对口音不敏感,但我不知道在哪里修修补补。有人知道我是怎么做到的吗?我无法更改所有客户数据库中的整理,并且我正在使用标准并且无法更改它,因为我创建了一个在我的域中包含标准的基础架构。

4

2 回答 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 回答