本文介绍了LINQ到实体:对NTEXT字段中使用ToLower将()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是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 :


  1. 的比较是一个包含模式,而不是严格的比较:容易字符串的contains()方法是允许在L2E

  2. 的比较必须是不区分大小写。我用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:


  1. 这是错误的可能(你的客户整理可能是,比如,土耳其语和您的数据库整理没有)。

  2. 这是的的效率低下;在SQL发射的而不是 = 与区分大小写排序。

  1. It's possibly wrong (your client collation could be, say, Turkish, and your DB collation not).
  2. 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 or StartsWith instead, if possible for your task
  • Change the default collation of the column?

这篇关于LINQ到实体:对NTEXT字段中使用ToLower将()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 08:07