为什么contains语句使用EF 6在sql中生成奇怪的字符

问题描述 投票:0回答:1

我有重音词搜索的问题,并通过用符号[]封装元音来解决它在sql server中,以查找带和不带重音的记录。例如,WHERE Name LIKE'%[aa] ci [oo] n%',这在SQL服务器中运行良好,但是当使用运算符包含EF生成查询时包含这会产生一个非常奇怪的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__linq00:'%〜[aa] cc~ [i]〜[o]]%'(Type = AnsiString,Size = 8000)

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

entity-framework character contains diacritics
1个回答
0
投票

SQL Server使用方括号作为其通配符表达式搜索的一部分,因此如果要将它们作为字符串进行搜索,则需要对其进行转义。虽然使用.Contains()将导致LIKE查询,但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();
© www.soinside.com 2019 - 2024. All rights reserved.