我正在使用带有区分大小写的数据库的SQL Server 2005。
在搜索功能中,我需要使用“where”子句创建Linq To Entities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较:
所有这些都表现得很好,但我遇到了以下异常: 在我的一个字段上,“参数数据类型ntext对于较低函数的参数1无效”。
该字段似乎是一个NText字段,我无法对其执行ToLower() 我能做些什么才能在NText字段上执行不区分大小写的Contains()?
答案 0 :(得分:29)
切勿使用.ToLower()
执行不区分大小写的比较。原因如下:
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
的限制意味着没有简单的方法可以做你想要的。
可能的解决方法可能包括:
Equals
或StartsWith
答案 1 :(得分:5)
在此处使用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"));
答案 2 :(得分:0)
正如我们所知,这是一个非常“错误”的情况。 它让我很烦恼。
今天,我决定创建一个视图:
从tableName中选择* 其中theColumn喜欢'%key%'
然后将此视图加载到EF。
生活变得轻松!