почему оператор содержит генерирует странные символы в SQL, используя EF 6 - PullRequest
0 голосов
/ 11 апреля 2019

У меня была проблема с поиском акцентированных слов, и я решил ее на сервере sql, заключив в гласные символы [], чтобы найти записи с ударением и без него.Например, WHERE Name LIKE '% [aa] ci [oo] n%', это хорошо работает на сервере SQL, но при генерации запроса с EF с использованием оператора Contains это создает очень странную запись SQL, и в настоящий моментпри выполнении запроса кажется, что сервер изменяет концепцию поиска, добавляя префикс символов "~"

. Я пытался использовать оператор Contains (concept), оператор Contains генерирует LIKE в sql, но изменяет строкукогда он включает символы [], в том числе между этим символом "~"

input:

string concept = "[aá] cc [ií] [oó] n" // ->который работает в запросе к серверу sql

EF Query:

 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" отличается от "[aá] cc[ií] [oó] n "из EF в EF вводом является строка, а при выполнении sql вводом является AnsiString и задаются странные символы

1 Ответ

0 голосов
/ 12 апреля 2019

SQL Server использует квадратные скобки как часть поиска по шаблонному выражению, поэтому, если вы хотите искать их как строку, они должны быть экранированы. Хотя использование .Contains() приведет к запросу LIKE, EF рассматривает выражение как литерал для «% value%», поэтому оно будет экранировать любые скобки или символы подстановки.

EF экранирует их с помощью тильды, поэтому он регистрирует тильду как escape-символ в сгенерированном скрипте.

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

Поскольку вы хотите использовать [] для операции, подобной символу подстановки, вам нужно использовать DbFunctions.Like с выражением в скобках.

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