NHibernate扩展了restiction

时间:2013-04-30 02:08:41

标签: c# nhibernate fluent-nhibernate

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

2 个答案:

答案 0 :(得分:0)

方法1

您可以使用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。

方法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

Can I customize collation of query results in nHibernate?

希望这有帮助。

答案 1 :(得分:0)

我解决了我的问题,创建了一个自定义标准,我检查方言以确定NHibernate正在使用的RDBMS,然后我创建自定义表达式。

我的代码在这里:source code