我有重音词搜索的问题,并通过用符号[]封装元音来解决它在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并设置陌生人角色
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();