【发布时间】:2014-09-02 04:04:04
【问题描述】:
我在使用代码首先针对 Oracle 数据库进行不区分大小写的字符串比较时遇到问题。代码看起来像这样;
String filter = "Ali";
var employee = dbContext.Employees.Where(x => x.Name.Contains(filter)).FirstOrDefault();
上面的代码是区分大小写的。所以我将名称和过滤器都转换为大写;
String filter = "Ali";
filter = filter.ToUpper();
var employee = dbContext.Employees.Where(x => x.Name.ToUpper().Contains(filter)).FirstOrDefault();
一开始似乎一切正常,但后来我意识到当员工姓名或过滤器包含字符“i”时它不起作用。问题是字母 i 在土耳其语中的工作方式。
在大多数语言中,“i”代表小写,“I”代表字符的大写。但是在土耳其语中,'i 的大写字母是 'İ',而 'I 的小写字母是 'ı'。这是一个问题,因为 Oracle 将 db 中的字母“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# 时,此解决方法的最佳做法或替代方法是什么?
提前致谢
【问题讨论】:
标签: c# oracle linq ef-code-first string-comparison