Csharp/C#教程:Linq to Entities:在NText字段上使用ToLower()分享


Linq to Entities:在NText字段上使用ToLower()

我正在使用SQL Server 2005,带有区分大小写的数据库。

在搜索function中,我需要使用“where”子句创建Linq To Entities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较:

  1. 比较是一个“包含”模式,而不是严格的比较:因为L2E中允许字符串的Contains()方法很容易
  2. 比较必须不区分大小写:我在两个元素上使用ToLower()来执行不敏感的比较。

所有这些都表现得非常好,但我遇到了以下exception:“我的一个字段上的参数数据类型ntext对于较低函数的参数1无效”。

看起来该字段是一个NText字段,我无法对其执行ToLower()。
我能做些什么才能在NText字段上执行不区分大小写的Contains()?

切勿使用.ToLower()执行不区分大小写的比较。 原因如下:

  1. 这可能是错误的(您的客户端排序规则可能是土耳其语,而您的数据库排序规则可能不是)。
  2. 这是非常低效的; SQL Emitted为LOWER而不是= ,不区分大小写的排序规则。

相反,使用StringComparison.OrdinalIgnoreCaseStringComparison.CurrentCultureIgnoreCase

 var q = from f in Context.Foos where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase) select f; 

但是对于Contains()存在一个问题:与EqualsStartsWith等不同,它没有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

(0)
上一篇 2022年2月5日
下一篇 2022年2月5日

精彩推荐