C# Linq到实体:在NText字段上使用ToLower()
我正在使用SQL Server 2005和区分大小写的数据库 在搜索函数中,我需要使用“where”子句创建一个Linq to Entities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较:C# Linq到实体:在NText字段上使用ToLower(),c#,sql-server-2005,linq-to-entities,C#,Sql Server 2005,Linq To Entities,我正在使用SQL Server 2005和区分大小写的数据库 在搜索函数中,我需要使用“where”子句创建一个Linq to Entities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较: 比较是一种“Contains”模式,而不是严格的比较:很容易,因为L2E中允许使用字符串的Contains()方法 比较必须不区分大小写:我在两个元素上使用ToLower()来执行不区分大小写的比较 所有这些性能都非常好,但我遇到了以下异常: 我的一个字段上的“参数数据类型ntex
如何才能对该NText字段执行不区分大小写的Contains()?切勿使用
.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
- 是否更改列的默认排序规则
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"));
正如我们所知,这是一个非常“窃听”的情况。 这让我很烦 今天,我决定创建一个视图,如下所示: 从tableName中选择* 其中列“%key%”之类的 然后将此视图加载到EF中
生活变得轻松了 哼。。。我猜你告诉我使用ToLower()是错误的,但我没有其他解决方案,因为:-更改排序规则对于某些搜索条件来说是太多的工作和风险-Equals和StartsWith不适合这里的需要。我正在考虑将NText字段转换为NVarchar并限制用户输入。。。在我的例子中,性能并不是很重要。我只是想告诉您选项是什么,而不是断言存在适合您的理想选项……这是Linq to Entities:目标是生成适当的SQL请求。您的解决方案将获取表中的所有行(或使用其他条件过滤的行),然后应用过滤器。事实上,这绝对是没有效率的:)。但我承认它会起作用的!我认为这个目标对实体来说是一个合适的linq?在效率方面。。。有时候,当你的客户尖叫着要修理那该死的臭虫,而你的老板却用手指轻敲你的眼睛时。。。效率和性能被高估了,除非它们没有被高估。仅仅因为某些东西可以被优化并不意味着它必须被优化。同意,我提到它是为了让使用这种技术的新手知道它真正的功能(我总是很惊讶有多少人使用L2E而不知道下面发生了什么)。因此,对于大型表,它可能会对性能/内存产生重大影响。对我来说,表演并不重要。当然,人们必须知道,这一点很好。这不适用于大量数据。