代码之家  ›  专栏  ›  技术社区  ›  Julien N

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

  •  13
  • Julien N  · 技术社区  · 15 年前

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

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

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

    “参数数据类型ntext对于我的一个字段上的”“lower function”“的参数1无效。”。

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

    3 回复  |  直到 15 年前
        1
  •  29
  •   Craig Stuntz    15 年前

    从不使用 .ToLower()

    1. 这可能是错误的(比如说,您的客户机排序规则可能是土耳其语,而您的DB排序规则可能不是)。
    2. 它是 高度地 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 争论。为什么?好问题;询问Microsoft。

    再加上SQLServer对 降低 意味着没有简单的方法来做你想做的事。

    可能的解决方法包括:

    • 使用全文索引,并在过程中执行搜索。
    • 等于 开始使用 相反,如果你的任务可能的话
        2
  •  5
  •   Ira Klotzko    12 年前

    在这里使用lambda表达式并创建一个可以处理lower子句的中介列表。

    var q = Context.Foos.ToList().Where(s => s.Bar.ToLower().Contains("hi"));
    

    var q = Context.Foos.Where(p => p.f1 == "foo" && p.f2 == "bar").
                ToList().Where(s => s.Bar.ToLower().Contains("hi"));
    
        3
  •  0
  •   Benny Ae    10 年前

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

    今天,我决定创建一个视图:

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

    然后将此视图加载到EF中。