首页 > 解决方案 > 如何在区分大小写的 Oracle 数据库中通过 Linq-To-Entities 强制进行不区分大小写的搜索?

问题描述

我正在开发一个仍在使用但代码库非常大的遗留系统(15 岁以上)。我们最近发现使用 Oracle 的客户端在搜索文本时存在区分大小写的问题。我无法对数据库或代码进行大的更改,但我仍然必须完成我的任务。出于某种原因,数据库创建者在其脚本中将列名和表名放在了双引号中,这迫使 Oracle 变得区分大小写。(Oracle DB 引用列名)意味着对这些表和列的任何查询都区分大小写。我需要使搜索不区分大小写,但我很难让 Linq-To-Entities 做到这一点。

到目前为止,我已经尝试创建一种文化,然后在忽略大小写的情况下检查 IndexOf:

orPredicate = orPredicate.Or(q => culture.CompareInfo.IndexOf(q.Data, tempValue, CompareOptions.IgnoreCase) >= 0);

系统响应:

“LINQ to Entities 无法识别方法 'Int32 IndexOf(System.String, System.String, System.Globalization.CompareOptions)' 方法,并且此方法无法转换为存储表达式。”

我也尝试过 ToLower():

orPredicate = orPredicate.Or(q => q.Data.ToLower().Contains(tempValue.ToLower()));

结果是:

OracleException: ORA-00904: "TOLOWER": 无效标识符

我尝试了几种扩展方法,这些方法在 Stack Overflow 上的其他一些问题中提出,但它们都是 IndexOf 方法的变体。

最令人沮丧的部分是,如果您输入确切的文本,它就可以工作。我们将该系统与 SQL Server 一起使用,在区分大小写方面也没有问题,因此遇到此问题的是我们唯一的基于 Oracle 的客户端。我无法对开发的数据库或搜索功能进行大规模更改,因此我需要找到一个解决方案,让 Oracle 进行比较而不用担心案例。只要它们正确匹配,转换和比较(设置为上限或下限)就可以了,但我不确定在这种情况下如何让它工作。

标签: c#.netoraclelinq-to-entitiescase-insensitive

解决方案


推荐阅读