Этот код чувствителен к регистру, как сделать его без учета регистра?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Ответы:
Предполагая, что мы работаем со строками, вот еще одно «элегантное» решение
IndexOf()
.источник
источник
IEqualityComparer<string>
атрибут для обработки сравнения. Использовать ToLower и ToUpper для проверки равенства - плохая идея. Попробуйте:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
напримерError 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
withStringComparer
не получает строку в качестве параметра, поэтому это будет ошибка сборки.IndexOf
на,Queryable
вероятно, не может быть переведен в SQL. Лично я нашел этот ответ полностью действительным, когда мы говорим о LINQ to database.Если запрос LINQ выполняется в контексте базы данных, вызов
Contains()
сопоставляетсяLIKE
оператору:.Where(a => a.Field.Contains("hello"))
становитсяField LIKE '%hello%'
. ПоLIKE
умолчанию оператор нечувствителен к регистру, но это можно изменить, изменив параметры сортировки столбца. .Если запрос LINQ выполняется в контексте .NET, вы можете использовать IndexOf () , но этот метод не поддерживается в LINQ to SQL.
LINQ to SQL не поддерживает методы, которые принимают CultureInfo в качестве параметра, возможно потому, что он не может гарантировать, что SQL-сервер обрабатывает культуры так же, как .NET. Это не совсем верно, потому что это поддерживает
StartsWith(string, StringComparison)
.Однако, похоже, что он не поддерживает метод, который оценивает
LIKE
в LINQ to SQL, и сравнение без учета регистра в .NET, что делает невозможным последовательное выполнение независимого от регистра метода Contains ().источник
insensitive
поиск по кейсу, а в другом мне это нужноcase sensitive
. Должен ли я просто взять производительность и использовать toLower ()?В принятом ответе здесь не упоминается тот факт, что при наличии пустой строки ToLower () сгенерирует исключение. Более безопасный способ был бы сделать:
источник
Используя C # 6.0 (который допускает функции выражения выражений и распространение нуля), для LINQ to Objects это можно сделать в одной строке, например, так (также проверяя наличие нуля):
источник
IndexOf работает лучше всего в этом случае
источник
Вы можете использовать строку.
если вы просто хотите проверить содержимое, используйте «Любой»
источник
источник
источник
Честно говоря, это не должно быть сложно. Может показаться, что в самом начале, но это не так. Вот простой запрос linq в C #, который выполняет именно так, как запрошено.
В моем примере я работаю со списком лиц, у которых есть одно свойство с именем FirstName.
Это будет искать в базе данных при поиске в нижнем регистре, но возвращать полные результаты регистра.
источник
Используйте метод String.Equals
источник