2013-02-12 2 views
1

У меня есть заявление LINQ следующим образом:ANYCASE Поиск Использование LINQ

myList = MyList.Where(x => 
    x.Name.Contains(SearchValue) || 
    x.Address.Contains(SearchValue)).ToList(); 

Моя база данных может иметь верхний или нижний регистр для Name поле, как «VSTS» или «VSTS»
Я хочу, чтобы мое заявление LINQ к выполнить в любом случае.

В приведенной выше инструкции LINQ, если я предоставляю значения нижнего регистра, а база данных имеет верхний регистр, поиск не выполняется. Этого я не хочу.

+1

Действительно ли это в LINQ to Objects или поставщик, ориентированный на базу данных? –

+0

его Linq to Objects, я извлек значения из базы данных до выполнения My linq-оператора. – vstsdev

+0

Возможный дубликат: http://stackoverflow.com/questions/444798/case-insensitive-containsstring/444813#444813 .. Вы даже пытались использовать Google, прежде чем задавать вопрос? – mipe34

ответ

3

Лучшим вариантом будет использование порядкового сравнения без учета регистра, однако метод Contains не поддерживает его, поэтому другим вариантом будет использование string.IndexOf.

Было бы лучше, чтобы обернуть это метод расширения, такие как:

public static bool Contains(this string target, string value, StringComparison comparison) 
{ 
    return target.IndexOf(value, comparison) >= 0; 
} 

Таким образом, вы можете использовать:

myList.Where(x => x.Name.Contains(SearchValue, StringComparison.OrdinalIgnoreCase) || 
        x.Address.Contains(SearchValue, StringComparison.OrdinalIgnoreCase)); 
+0

спасибо, это было действительно полезно .. – vstsdev

0

Попробуйте это:

myList = MyList.Where(x => 
    x.Name.ToLower().Contains(SearchValue.ToLower()) || 
    x.Address.ToLower().Contains(SearchValue.ToLower())).ToList(); 

Проверьте, если это работает для Linq2Entity, может быть ToLower не удается: р

+0

Нормализация должна быть сделана в верхнем случае. http://msdn.microsoft.com/en-us/library/bb386042.aspx –

+0

ничего себе. хорошо, спасибо! –

1

Используйте следующее:

myList = MyList.Where(x => 
    x.Name.ToUpper(CultureInfo.InvariantCulture).Contains(
     SearchValue.ToUpper(CultureInfo.InvariantCulture)) || 
    x.Address.ToUpper(CultureInfo.InvariantCulture).Contains(
     SearchValue.ToUpper(CultureInfo.InvariantCulture))). 
    ToList(); 
+1

Нормализация должна быть выполнена в верхнем корпусе. http://msdn.microsoft.com/en-us/library/bb386042.aspx –

+0

@Jean Hominal thanx^_^ –

0

вы можете попробовать ToLower():

myList = MyList.Where(x => x.Name.ToLower().Contains(SearchValue.ToLower()) 
    || x.Address.ToLower().Contains(SearchValue.ToLower())).ToList(); 
+0

Нормализация должна быть выполнена в верхнем корпусе. http://msdn.microsoft.com/en-us/library/bb386042.aspx –

0

Если вам нужно использовать Содержит(), попробуйте следующее:

var svUP = SearchValue.ToUpper(); 
myList = MyList.Where(x => x.Name.ToUpper().Contains(svUP) || x.Address.ToUpper().Contains(svUP)).ToList(); 

Но если ваши поля содержат полное значение поиска и только проблема - это корпус, вы должны использовать Equals() с помощью StingCompar ison вместо:

myList = MyList.Where(x => x.Name.Equals(SearchValue, StringComparison.InvariantCultureIgnoreCase) || x.Address.Equals(SearchValue, StringComparison.InvariantCultureIgnoreCase)).ToList(); 
+0

Лучше всего использовать 'ToUpperInvariant()' вместо 'ToUpper()' =) –

Смежные вопросы