Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到实体:在NText字段上使用ToLower()_C#_Sql Server 2005_Linq To Entities - Fatal编程技术网

C# Linq到实体:在NText字段上使用ToLower()

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

我正在使用SQL Server 2005和区分大小写的数据库

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

  • 比较是一种“Contains”模式,而不是严格的比较:很容易,因为L2E中允许使用字符串的Contains()方法
  • 比较必须不区分大小写:我在两个元素上使用ToLower()来执行不区分大小写的比较
  • 所有这些性能都非常好,但我遇到了以下异常: 我的一个字段上的“参数数据类型ntext对于低级函数的参数1无效”

    该字段似乎是一个NText字段,我无法对其执行ToLower()。
    如何才能对该NText字段执行不区分大小写的Contains()?

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

  • 这可能是错误的(比如说,您的客户机排序规则可能是土耳其语,而您的DB排序规则可能不是)
  • 效率很低;发出的SQL是
    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
    • 是否更改列的默认排序规则

    在此处使用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"));
    

    正如我们所知,这是一个非常“窃听”的情况。 这让我很烦

    今天,我决定创建一个视图,如下所示:

    从tableName中选择* 其中列“%key%”之类的

    然后将此视图加载到EF中


    生活变得轻松了

    哼。。。我猜你告诉我使用ToLower()是错误的,但我没有其他解决方案,因为:-更改排序规则对于某些搜索条件来说是太多的工作和风险-Equals和StartsWith不适合这里的需要。我正在考虑将NText字段转换为NVarchar并限制用户输入。。。在我的例子中,性能并不是很重要。我只是想告诉您选项是什么,而不是断言存在适合您的理想选项……这是Linq to Entities:目标是生成适当的SQL请求。您的解决方案将获取表中的所有行(或使用其他条件过滤的行),然后应用过滤器。事实上,这绝对是没有效率的:)。但我承认它会起作用的!我认为这个目标对实体来说是一个合适的linq?在效率方面。。。有时候,当你的客户尖叫着要修理那该死的臭虫,而你的老板却用手指轻敲你的眼睛时。。。效率和性能被高估了,除非它们没有被高估。仅仅因为某些东西可以被优化并不意味着它必须被优化。同意,我提到它是为了让使用这种技术的新手知道它真正的功能(我总是很惊讶有多少人使用L2E而不知道下面发生了什么)。因此,对于大型表,它可能会对性能/内存产生重大影响。对我来说,表演并不重要。当然,人们必须知道,这一点很好。这不适用于大量数据。