问题描述
我使用的是SQL Server 2005中,有一个区分大小写的数据库。
I'm using SQL Server 2005, with a case sensitive database..
在搜索功能,我需要创建一个LINQ到实体(L2E)查询与where子句在数据库中这些规则比较几个字符串的数据:
In a search function, I need to create a Linq To Entities (L2E) query with a "where" clause that compare several strings with the data in the database with these rules :
- 的比较是一个包含模式,而不是严格的比较:容易字符串的contains()方法是允许在L2E
- 的比较必须是不区分大小写。我用ToLower将()两个元素来执行不区分大小写比较
这一切都进行得很好,但我遇到了以下异常:
参数的数据类型NTEXT是较低的函数的参数1无效在我的领域之一。
All of this performs really well but I ran into the following Exception : "Argument data type ntext is invalid for argument 1 of lower function" on one of my fields.
看来这个字段是ntext的领域,我不能对一个ToLower将()。结果
我能做什么,以便能够在该领域NTEXT执行不区分大小写包含()?
It seems that the field is a NText field and I can't perform a ToLower() on that.
What could I do to be able to perform a case insensitive Contains() on that NText field ?
推荐答案
不要使用 .ToLower()
来进行区分大小写的比较。这里的原因:
Never use .ToLower()
to perform a case-insensitive comparison. Here's why:
- 这是错误的可能(你的客户整理可能是,比如,土耳其语和您的数据库整理没有)。
- 这是的高的效率低下;在SQL发射的
下
而不是=
与区分大小写排序。
- It's possibly wrong (your client collation could be, say, Turkish, and your DB collation not).
- It's highly inefficient; the SQL Emitted is
LOWER
instead of=
with a case-insensitive collation.
相反,使用 StringComparison.OrdinalIgnoreCase
或 StringComparison.CurrentCultureIgnoreCase
:
var q = from f in Context.Foos
where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
select f;
但包含()
有一个问题:与等于
, StartsWith
等,它不具备一个 StringComparison
参数的重载。为什么?好问题;问微软。
But for Contains()
there's a problem: Unlike Equals
, StartsWith
, etc., it doesn't have an overload for a StringComparison
argument. Why? Good question; ask Microsoft.
这与SQL Server的关于限制LOWER
意味着有没有简单的方法做你想做的结合。
That, combined with SQL Server's limitation on LOWER
means there's no simple way to do what you want.
可能的解决方法可能包括:
Possible workarounds might include:
- 使用全文索引,并做一个程序进行搜索。
- 使用
等于
或StartsWith
相反,如果可能的话你的任务 - 更改列的默认排序规则?
- Use a full text index, and do the search in a procedure.
- Use
Equals
orStartsWith
instead, if possible for your task - Change the default collation of the column?
这篇关于LINQ到实体:对NTEXT字段中使用ToLower将()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!