2013-03-12 13 views
10

Próbuję kwerendy mój zestaw wyników w ten sposób w linq do podmiotów;LINQ do encji Zawiera Case In-Sensitive Searching

var categoriesList = _catRepo.GetAllCategories(); 


filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

Jednak ja nie dostać żadnego rezultatu ponieważ posiadał CategoryName jest For(Upper Case) w bazie danych. Sprawdziłem również sortowanie serwera sql i jest ustawiony na _CI_AS. Nie mam pojęcia, jak używać do filtrowania znaków niewrażliwych na wielkość liter? Chcę zasadniczo, jeśli ktoś typu;

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

LUB

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("For")); 

Wynik powinien być taki sam

+3

Czy odpowiada to na pytanie? http://stackoverflow.com/questions/3360772/linq-contains-case-insensitive –

+0

to nie działa dla mnie –

+1

Myślę, że zwykle działa z sortowaniem, które mówisz. Czy jesteś pewien, że 'categoriesList' jest kwerendą DB, a nie zapytaną już na liście pamięci (w takim przypadku twoje wyrażenie nie zostanie przetłumaczone na sql). Ponadto, jeśli prześledzisz zapytania bazy danych w tym momencie, jaki kod SQL jest generowany? –

Odpowiedz

17

Spróbuj

filteredCategories = categoriesList.Where(c=> 
c.CategoryName.IndexOf("for", StringComparison.OrdinalIgnoreCase) >= 0) 

Zawiera metoda działa tak jak pokazano poniżej

public bool Contains(string value) 
{ 
    return this.IndexOf(value, StringComparison.Ordinal) >= 0; 
} 
+2

+1 za wyjaśnienie indexof? –

+0

http://msdn.microsoft.com/en-us/library/ms224425.aspx – Shymep

+9

Nie będzie działać, jeśli działa bezpośrednio na obiektach EF. Nie można przetłumaczyć polecenia 'IndexOf()' – Rufix

6

Poprzednia odpowiedź: IndexOf powinna działać. Ponieważ ładujesz wszystkie obiekty z bazy danych, a następnie wykonujesz filtr w pamięci (linq to objects), w ogóle nie robisz niczego w bazie danych.

Powinno to również działa (z postu odwołanie)

filteredCategories = categoriesList.Where(c=> c.CategoryName.ToLower().Contains("for")); 

Tak na marginesie, jeśli masz wiele kategorii, to może chcesz filtrować je w bazie danych, zamiast sprowadzić wszystko od db, a następnie filtrować je w pamięci ..

+0

Contains zadzwoni do IndexOf tak czy inaczej – Shymep

+0

@Shymep Yup Wiem, po prostu oferowałem ten zestaw dla kompletności :) –

+1

To nie przechodzi testu z Turcji http://www.moserware.com/2008/02/ -Twoje-kod-pass-turkey-test.html – Odys