为什么包含语句使用EF 6在SQL中生成奇怪的字符

时间:2019-04-11 19:41:05

标签: entity-framework character contains diacritics

我对重音词搜索有问题,并在sql server中通过用符号[]封装元音来查找带重音和不带重音的记录来解决了这个问题。例如,WHERE Name LIKE'%[aa] ci [oo] n%',在SQL Server中效果很好,但是当使用操作符EF用EF生成查询时,包含此内容会生成一个非常奇怪的SQL记录,并且此刻执行查询的过程中,服务器似乎通过在字符前面加上“〜”来修改搜索概念

我尝试使用包含语句(concepts),包含语句在sql中生成LIKE,但是当包含符号[]时,它会修改字符串,包括在该符号“〜”之间

输入:

string concept =“ [aá] cc [ií] [oó] n” //->可在sql服务器查询中使用

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并设置陌生字符

1 个答案:

答案 0 :(得分:0)

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

EF正在使用Tilde对其进行转义,因此它在生成的脚本中将Tilde注册为转义字符。

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

由于要对通配符式操作使用[],因此需要在括号表达式中使用DbFunctions.Like

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