实体框架代码优先字符串与Oracle Db的比较

tdgtyugdyugdrugdr

我在先对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#时,最佳解决方案或替代方法是什么?

提前致谢

约书亚·胡伯(Joshua Huber)

沟渠使用所有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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架核心Cosmos Db-如何比较不区分大小写的字符串?

来自分类Dev

实体框架和字符串作为Oracle Db上的NCLOB

来自分类Dev

实体框架FirstOrDefault中的字符串比较异常

来自分类Dev

将日期与字符串实体框架进行比较

来自分类Dev

将日期与字符串实体框架进行比较

来自分类Dev

比较iOS中sqLite DB中的字符串(日期)

来自分类Dev

比较iOS中sqLite DB中的字符串(日期)

来自分类Dev

Oracle DB的实体框架

来自分类Dev

将字符串转换为数字DB2实体框架

来自分类Dev

带有代码优先连接字符串的实体框架到远程数据库

来自分类Dev

用于字符串比较的代码优化

来自分类Dev

Oracle SQL字符串比较

来自分类Dev

Oracle SQL字符串比较

来自分类Dev

查询中的 Oracle 字符串比较

来自分类Dev

实体框架6.0代码优先迁移到Azure SQL DB无效。

来自分类Dev

laravel 查询来比较 DB 中的两个字符串

来自分类Dev

Swift CoreData将字符串与实体进行比较

来自分类Dev

Swift CoreData将字符串与实体进行比较

来自分类Dev

LINQ 将实体的属性与字符串数组进行比较

来自分类Dev

在Oracle DB中分割字符串

来自分类Dev

在Oracle DB中分割字符串

来自分类Dev

比较字符串

来自分类Dev

实体框架代码优先方法是否需要SQL Server db_ddladmin权限,这是否存在安全问题?

来自分类Dev

实体框架6在代码中设置连接字符串

来自分类Dev

代码比较字符串时有错误

来自分类Dev

android代码中的字符串比较错误

来自分类Dev

比较oracle sql中的确切字符串

来自分类Dev

Oracle PL / SQL字符串文字上的字符串比较:意外结果

来自分类Dev

sql oracle比较包含子字符串的字符串

Related 相关文章

热门标签

归档