C# NHibernate扩张性拘束

C# NHibernate扩张性拘束,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我需要像extend-Like-restriction这样的限制来支持重音不敏感,但我不知道在哪里进行修补。有人知道我是怎么做到的吗?我无法更改所有客户数据库中的collate,我使用的是条件,无法更改,因为我创建了一个在我的域中封装条件的基础结构。方法1 您可以使用SQL表达式来实现这一点,即 Expression.Sql( "your_field COLLATE Latin1_general_CI_AI LIKE ? COLLATE Latin1_general_CI_AI",

我需要像extend-Like-restriction这样的限制来支持重音不敏感,但我不知道在哪里进行修补。有人知道我是怎么做到的吗?我无法更改所有客户数据库中的collate,我使用的是条件,无法更改,因为我创建了一个在我的域中封装条件的基础结构。

方法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>();
var user=session.CreateQuery(“来自用户u
其中accentinsensitivelike(u.name,:name)“)
.SetParameter(“名称”,名称)
.UniqueResult();
这种方法的优点是可以跨多个DBMS工作,但比第一种方法的工作量要大得多

有关更多详细信息,请参阅以下


希望这有帮助。

我解决了创建自定义标准的问题,在该标准中,我检查方言以确定NHibernate正在使用的RDBMS是什么,然后为其创建自定义表达式


我的代码在这里:

我的应用程序可以在不同的数据库中运行,所以我不能使用它。@DiegoDias我已经用另一种可能的解决方案更新了我的答案。我更喜欢创建自定义条件来解决我的问题。我检查方言,然后创建一个自定义查询表达式。@DiegoDias如果您在解决方案中添加一个答案就好了。