使用 linq to entities (EF) 和 Oracle 12.1 忽略搜索重音

Ignore accents on search using linq to entities (EF) and Oracle 12.1

我需要对 table 搜索一个包含重音符号的字符串字段,可以应用许多运算符:开始于、包含、等于、在列表中... 如果我搜索 Müller 我也想检索 Muellerueü 在德语中的翻译),对于其他有重音符号的字母也是如此,我知道可以通过修改 NLS_COMPNLS_SORT

来实现
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;
SQL> ALTER SESSION SET NLS_SORT=BINARY_AI;

我也知道可以在列级别进行排序,但这仅在 12.2 版本后可用, 有什么想法吗?

感谢您的帮助,

比莱尔

我已经使用 oracle NLS session parameters 解决了我的问题。

 if(condition == true)
   AlterSortSession(context);

 public void AlterSortSession(MyContext context)
 {
   var connection = (OracleConnection)context.Database.Connection;
   connection.StateChange += AlterSortSession;
 }

 private static void AlterSortSession(object sender, StateChangeEventArgs e)
 {
  if (e.CurrentState != ConnectionState.Open)
    return;

  var connection = (OracleConnection)sender;
  OracleGlobalization info = connection.GetSessionInfo();

  info.Sort = "XGERMAN_DIN_AI";
  info.Comparison = "LINGUISTIC";

  connection.SetSessionInfo(info);
}

文档可用 here OracleGlobalization

这对我适用于 EF4:

using (var context = new Entities()) {

    // Set Case Insensitive, Accent Insensitive

    var orcl = (OracleConnection)(((System.Data.EntityClient.EntityConnection)(context.Connection)).StoreConnection);

    if (context.Connection.State != System.Data.ConnectionState.Open)
    {
        context.Connection.Open();
    }

    var sInfo = orcl.GetSessionInfo();

    sInfo.Sort = "GENERIC_M_AI";
    sInfo.Comparison = "LINGUISTIC";

    orcl.SetSessionInfo(sInfo);

    // Execute linq query

    var row = context.table.Where(a => a.varcharField.Contains("match str")).FirstOrDefault();

}