Текстовый поиск как SQL COLLATE Latin1_General_CI_AI с LINQ - PullRequest
0 голосов
/ 29 ноября 2018

Я могу без проблем искать в таблице клиентов по SQL.

select Name
from Customers
where  Name COLLATE Latin1_General_CI_AI like '%ozgur%'

Этот запрос может найти "özgür"

Когда я помещаю эту таблицу в кэш и пытаюсь найти эту таблицу с помощьюlinq, я не могу найти "özgür" по поисковому слову "ozgur".

Есть ли подобный способ использования Latin1_General_CI_AI в C # LINQ?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Единственное место, где я обнаружил, что используется сопоставление, это условие Entity SQL ORDER BY .

Вы можете использовать SqlQuery , как показано здесь для использования строки SQL (с параметрами, конечно), которая использует предложение COLLATE:

var query = "select Name from Customers " +
           " where  Name COLLATE Turkish_CI_AI like @name";
var results = myContext.Customers
                       .SqlQuery(query,new SqlParameter("@name","%ozgur%"))
                       .ToList();

Я бы посоветовал быть осторожным.LIKE '%...%' не может воспользоваться никакими индексами, которые покрывают поле name, и ему придется искать всю таблицу.Даже Name = @name COLLATE ... может не использовать индексы, параметры сортировки которых не совпадают с индексом, с которым был построен индекс.

Вам следует рассмотреть возможность использования полнотекстового поиска индексов и выполнять полнотекстовые поисковые запросы для конкретных слов, например:

SELECT Name from Customers WHERE CONTAINS(Name ,@thatName)

Обновление

Другой вариант - использовать перехватчик для изменения SQL, сгенерированного предложением, как показано в этом SO вопросе .Этот перехватчик использует регулярное выражение для замены LIKE на CONTAINS.Более простое выражение можно использовать для вставки предложения COLLATE до LIKE

Код не является тривиальным, но, по крайней мере, это вариант.

0 голосов
/ 29 ноября 2018

Почему вы не используете следующее предложение filer для значений Unicode

Преобразование типа сортировки вызовет проблемы с производительностью и предотвратит использование индекса

select Name
from Customers
where Name like N'%özgür%'
...