【问题标题】:why the contains statement generates strange characters in sql using EF 6为什么 contains 语句使用 EF 6 在 sql 中生成奇怪的字符
【发布时间】:2019-04-11 19:41:05
【问题描述】:

我遇到了重音词搜索的问题,并在 sql server 中通过用符号 [] 封装元音来解决它,以查找带和不带重音的记录。比如 WHERE Name LIKE '%[aa] ci [oo] n%',这在 SQL server 中效果很好,但是当使用 EF 运算符生成查询时 contains this 会生成一条很奇怪的 SQL 记录,而此时在执行查询时,服务器似乎通过前缀字符“~”来修改搜索概念

我尝试过使用Contains(概念)语句,Contains语句在sql中生成LIKE,但是当它包含符号[]时它会修改字符串,包括在这个符号“~”之间

输入:

string concept = "[aá]cc[ií][oó]n" //-> 适用于 sql server 查询

EF查询:

 using (Entities ctx = new Entities())
 {
    ctx.Database.Log = Console.Write;
    var result = ctx.Product.Where(w =w.Name.Contains(concept)).ToList();
    return result;
 }

生成的sql:

SELECT
   [Extent1].[Id] AS [Id],
   [Extent1].[Name] AS [Name],
   [Extent1].[Description] AS [Description],
   [Extent1].[Price] AS [Price]
  FROM [dbo].[Product] AS [Extent1]
WHERE [Extent1].[Name] LIKE @p__linq__0 ESCAPE '~'

-- p__linq__0: '%~[aá]cc~[ií]~[oó]n%' (Type = AnsiString, Size = 8000)

"~[aá]cc~[ií]~[oó]n" 与 EF 中的 "[aá]cc[ií][oó]n" 不同 EF中输入的是字符串,执行sql时输入的是AnsiString并设置陌生字符

【问题讨论】:

  • Contains 未实现为支持所有可能的模式匹配通配符。使用DbFunctions.Like

标签: entity-framework character contains diacritics


【解决方案1】:

SQL Server 使用方括号作为通配符表达式搜索的一部分,因此如果您想将它们作为字符串进行搜索,则需要对其进行转义。虽然使用 .Contains() 将导致 LIKE 查询,但 EF 将表达式视为 "%value%" 的文字,因此它将转义任何括号或通配符。

EF 使用波浪号对它们进行转义,因此它将波浪号注册为生成脚本中的转义字符。

https://www.techonthenet.com/sql_server/like.php

由于您想将 [] 用于类似通配符的操作,因此您需要将 DbFunctions.Like 与括号表达式一起使用。

var result = ctx.Product.Where(w=> DbFunctions.Like(w.Name, concept)).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2022-01-13
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多