使用 linq to entities (EF) 和 Oracle 12.1 忽略搜索重音
Ignore accents on search using linq to entities (EF) and Oracle 12.1
我需要对 table 搜索一个包含重音符号的字符串字段,可以应用许多运算符:开始于、包含、等于、在列表中...
如果我搜索 Müller
我也想检索 Mueller
(ue
是 ü
在德语中的翻译),对于其他有重音符号的字母也是如此,我知道可以通过修改 NLS_COMP
和 NLS_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();
}
我需要对 table 搜索一个包含重音符号的字符串字段,可以应用许多运算符:开始于、包含、等于、在列表中...
如果我搜索 Müller
我也想检索 Mueller
(ue
是 ü
在德语中的翻译),对于其他有重音符号的字母也是如此,我知道可以通过修改 NLS_COMP
和 NLS_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();
}