Linq to Entities:在NText字段上使用ToLower()
我正在使用SQL Server 2005,带有区分大小写的数据库。
在搜索function中,我需要使用“where”子句创建Linq To Entities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较:
- 比较是一个“包含”模式,而不是严格的比较:因为L2E中允许字符串的Contains()方法很容易
- 比较必须不区分大小写:我在两个元素上使用ToLower()来执行不敏感的比较。
所有这些都表现得非常好,但我遇到了以下exception:“我的一个字段上的参数数据类型ntext对于较低函数的参数1无效”。
看起来该字段是一个NText字段,我无法对其执行ToLower()。
我能做些什么才能在NText字段上执行不区分大小写的Contains()?
切勿使用.ToLower()
执行不区分大小写的比较。 原因如下:
- 这可能是错误的(您的客户端排序规则可能是土耳其语,而您的数据库排序规则可能不是)。
- 这是非常低效的; SQL Emitted为
LOWER
而不是=
,不区分大小写的排序规则。
相反,使用StringComparison.OrdinalIgnoreCase
或StringComparison.CurrentCultureIgnoreCase
:
var q = from f in Context.Foos where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase) select f;
但是对于Contains()
存在一个问题:与Equals
, StartsWith
等不同,它没有StringComparison
参数的重载。 为什么? 好问题; 问问微软。
结合SQL Server对LOWER
的限制意味着没有简单的方法来做你想要的。
可能的解决方法可能包括:
在这里使用lambda表达式并创建一个可以处理lower子句的中间列表。
var q = Context.Foos.ToList().Where(s => s.Bar.ToLower().Contains("hi"));
效率不是很高,但确实有效。 如果你在where子句中有其他谓词,那么它对你有利:
var q = Context.Foos.Where(p => p.f1 == "foo" && p.f2 == "bar"). ToList().Where(s => s.Bar.ToLower().Contains("hi"));
正如我们所知,这是一个非常“错误”的情况。 它让我很烦恼。
今天,我决定创建一个视图:
select * from tableName其中theColumn如’%key%’
然后将此视图加载到EF中。
生活变得轻松!
上述就是C#学习教程:Linq to Entities:在NText字段上使用ToLower()分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1045283.html