c# - 如何在区分大小写的 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 进行比较而不用担心案例。只要它们正确匹配,转换和比较(设置为上限或下限)就可以了,但我不确定在这种情况下如何让它工作。
解决方案
推荐阅读
- r - 如何对依赖于测试机器上不存在的库的条件进行单元测试
- html - Safari 会破坏滚动中表格行的样式
- rust - 如何在 rust 中迭代 vec 或 slice 的前缀或后缀?
- python - 在 Tkinter 中使用 > 运算符
- php - 带有 Symfony 开发服务器的 Alamofire 没有有效的 ssl
- php - sh:pdftotext:找不到命令
- pattern-matching - 如何匹配任何大于 1 的数字的模式
- python - 时间数据不匹配格式
- typescript - 如何检查函数中的字符串参数是否与打字稿中的对象路径匹配?
- typescript - 错误:未经授权将动物区系与阿波罗一起使用