忽略使用linq to实体(EF)和Oracle 12.1进行搜索时的重音符号

时间:2019-02-12 10:31:28

标签: oracle entity-framework collation

我需要在包含重音符号的字符串字段的表上执行搜索,可以应用许多运算符:以列表开头,包含,等于... 如果我搜索Müller,我还要检索Muellerueü的德语翻译),对于其他带有重音符号的字母,我也知道可以通过修改NLS_COMPNLS_SORT

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

我也知道可以在列级别进行归类,但这仅从12.2版本开始可用, 有什么想法吗?

谢谢您的帮助,

Bilel

2 个答案:

答案 0 :(得分:1)

我已经使用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);
}

OracleGlobalization的{​​{3}}文档可用

答案 1 :(得分:0)

这对于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();

}