EF, SQLite и поиск на русском

321
02 марта 2017, 22:14

У меня не очень получается искать на русском в SQLite средствами EF. Делаю так

if (!string.IsNullOrWhiteSpace(Filters.TextFilter))
    query.AddFilter(f => f.LocalName.ToLower().Contains(Filters.TextFilter.ToLower()) ||
    f.OriginalName.ToLower().Contains(Filters.TextFilter.ToLower()) ||
    f.Description.ToLower().Contains(Filters.TextFilter.ToLower()));

Вот метод добавления фильтра

public void AddFilter(Expression<Func<T,bool>> filter)
{
    _currentQuery = _currentQuery.Where(filter);
}

Когда в поисковой фразе русские слова, ищет как попало и че попало. Во первых, игнорирование регистра не работает при этом (а на английском все норм). Во вторых, когда пишу по русски с большой буквы (чтобы наверняка сработало), находит больше чем должен.

База в кодировке UTF-8

Первое, что пришло в голову - в VS строки в Unicode. Поэтому сделал так

byte[] bytes = null;
var str = string.Empty;
if (!string.IsNullOrWhiteSpace(Filters.TextFilter))
{
    bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, Encoding.Unicode.GetBytes(Filters.TextFilter.ToUpper()));
    str = Encoding.UTF8.GetString(bytes);
}
if (!string.IsNullOrWhiteSpace(Filters.TextFilter))
    query.AddFilter(f => f.LocalName.ToUpper().Contains(str) ||
    f.OriginalName.ToUpper().Contains(str) ||
    f.Description.ToUpper().Contains(str));

Игнорирование регистра теперь работает нормально. Осталась проблема с неправильным поиском. Вот скрин

откуда там взялся Heaven? Я проверил в базе, в его полях нет вхождения "эпик". Что я делаю не так?

Кроме того, я посмотрел запрос, который формирует EF. Я не буду приводить его весь, приведу кусочек фильтра на вхождение строки.

(CHARINDEX(@p__linq__0, UPPER([Extent1].[LocalName]))) > 0

Я открываю SQLite Studio, чтобы самостоятельно создать запрос таким образом, но это не работает.

[13:09:38] Ошибка при выполнении SQL запроса к базе данных 'DB': no such function: CHARINDEX

Объясните кто нибудь что тут происходит?

READ ALSO
как синхронизировать гугл календарь

как синхронизировать гугл календарь

я знаю имейл календаря в который нужно вписать события, как это сделать программна черезnet?

277
Многоуровневая выборка в классе

Многоуровневая выборка в классе

Есть список List<Helper> list = new List<Helper>();

340