2015-10-29 2 views
1

Я пытаюсь найти объекты (Tag ы) в базе данных по их Name собственности, где важно, чтобы игнорировать регистр (Когда database ищутся и база данных содержит тег с именем Database, что нужно вернуть). Сейчас мой код выглядит следующим образом:Сравнить строки без учета регистра

public IEnumerable<db.Tag> FindByNames(IEnumerable<string> tagNames) 
{ 
    return this.DatabaseContext.Tags 
     .Where(tag => tagNames.Contains(tag.Name)); 
} 

Очевидно, что этот вопрос чувствителен к регистру. Я попытался предоставить StringComparer.OrdinalIgnoreCase в качестве сравнения с методом Contains, но получил предупреждение во время выполнения, что выражение не может быть переведено и будет выполняться в коде, а не в базе данных (я не помню точное сообщение, я отредактирую как только я вернусь на свою машину разработки). Я могу жить с этим, если это необходимо, но было бы неплохо узнать, как сделать базу данных в этом случае. Является ли это возможным?

+0

Пожалуйста, см (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their [ "Должны ли вопросы включают„метки“в их названиях?"] - названия), где консенсус «нет, они не должны»! Кроме того, вам может потребоваться пересмотреть операцию «Содержит», так как это будет иметь линейную (или худшую) производительность. Если коллекция содержит много элементов, вставка в временную таблицу с индексом и выполнение объединения может быть опция. –

ответ

1

Никаких изменений не требуется. SQLite «LIKE» уже не учитывает регистр.

Поведение оператора LIKE по умолчанию - игнорировать регистр символов ASCII.

(CREF https://www.sqlite.org/pragma.html#pragma_case_sensitive_like и Case sensitive and insensitive like in SQLite)

Конечно, вы всегда можете использовать .FromSql(), чтобы получить точный запрос, который вы хотите. Пример:

context.Tags.FromSql("SELECT * FROM tags WHERE name LIKE '%{0}%'", tagName) 
Смежные вопросы