我在先对Oracle数据库使用代码进行不区分大小写的字符串比较时遇到麻烦。代码看起来像这样;
String filter = "Ali";
var employee = dbContext.Employees.Where(x => x.Name.Contains(filter)).FirstOrDefault();
上面的代码区分大小写。因此我将Name和filter都转换为大写。
String filter = "Ali";
filter = filter.ToUpper();
var employee = dbContext.Employees.Where(x => x.Name.ToUpper().Contains(filter)).FirstOrDefault();
一切似乎一开始都可以,但是后来我意识到,当员工的姓名或过滤器包含字符“ i”时,它就无法正常工作。问题是我用土耳其语怎么写这封信。
在大多数语言中,“ i”代表小写字母,“ I”代表字符的大写字母。但是在土耳其语中,“ i”的大写字母是“İ”,而“ I”的小写字母是“ı”。这是一个问题,因为Oracle在数据库中将字母“ i”大写为“ I”。
我们无法访问数据库的字符编码设置,因为无法轻松预见其效果。
我想出的是这个,而且非常难看。
String filterInvariant = filter.ToUpper(CultureInfo.InvariantCulture);
String filterTurkish = filter.ToUpper(CultureInfo.CreateSpecificCulture("tr-TR"));
var employee = dbContext.Employees.Where(x => x.Name.ToUpper().Contains(filterInvariant) || x.Name.ToUpper().Contains(filterTurkish)).FirstOrDefault();
它似乎解决了一些问题,但感觉像是一种蛮力的解决方法,而不是一个可靠的解决方案。在针对Oracle数据库使用Code First C#时,最佳解决方案或替代方法是什么?
提前致谢
沟渠使用所有UPPER
功能。只需让Oracle执行您的语言感知的不区分大小写的匹配即可。这是通过将来自C#的数据库连接设置为具有适当的语言参数来完成的。此设置仅用于您的数据库会话,而不是整个数据库的全局更改。我不是C#向导,所以您必须找出在数据库连接/池代码中进行这些会话设置的位置。
ALTER SESSION SET nls_language=TURKISH;
ALTER SESSION SET nls_comp=LINGUISTIC;
ALTER SESSION SET nls_sort=BINARY_CI;
如果证明C#很难在哪里更改,可以将其设置为用户/模式登录触发器(如下),该触发器将在db连接时自动为您设置(替换SOMEUSER
为实际的db用户名)。这只会影响任何新的数据库会话,因此,如果池中有连接池,则需要循环数据库连接池以刷新连接。
CREATE OR REPLACE TRIGGER SOMEUSER.SET_NLS_CASE_INSENSITIVE_TRG AFTER
LOGON ON SOMEUSER.SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET nls_language=TURKISH';
EXECUTE IMMEDIATE 'ALTER SESSION SET nls_comp=LINGUISTIC';
EXECUTE IMMEDIATE 'ALTER SESSION SET nls_sort=BINARY_CI';
END;
/
这是我在Oracle数据库中进行的一些测试:
CREATE TABLE mypeople (name VARCHAR2(10 CHAR));
INSERT INTO mypeople VALUES ('Alİ Hassan');
INSERT INTO mypeople VALUES ('AlI Hassan');
INSERT INTO mypeople VALUES ('Ali Hassan');
INSERT INTO mypeople VALUES ('Alı Hassan');
SELECT name FROM mypeople WHERE name LIKE 'Ali%';
NAME
----------
Ali Hassan
ALTER SESSION SET nls_language=TURKISH;
ALTER SESSION SET nls_comp=LINGUISTIC;
ALTER SESSION SET nls_sort=BINARY_CI;
SELECT name FROM mypeople WHERE name LIKE 'Ali%';
NAME
----------
Alİ Hassan
AlI Hassan
Ali Hassan
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句