W tym kodzie rozróżniana jest wielkość liter, jak sprawić, by wielkość liter nie była rozróżniana?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Odpowiedzi:
Zakładając, że pracujemy tutaj ze stringami, oto kolejne „eleganckie” rozwiązanie wykorzystujące
IndexOf()
.źródło
źródło
IEqualityComparer<string>
atrybutu do obsługi porównania. Użyj ToLower i ToUpper, aby sprawdzić równość, to zły pomysł. Spróbuj:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
na przykładError 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
nie otrzymuje łańcucha jako parametru, więc będzie to błąd kompilacji.IndexOf
onQueryable
prawdopodobnie nie może zostać przetłumaczony na SQL. Osobiście uważam, że ta odpowiedź jest całkowicie ważna, ponieważ mówimy o LINQ do bazy danych.Jeśli zapytanie LINQ jest wykonywane w kontekście bazy danych, wywołanie
Contains()
jest mapowane na plikLIKE
operatora:.Where(a => a.Field.Contains("hello"))
staje sięField LIKE '%hello%'
.LIKE
Operator nie uwzględnia wielkości liter domyślnie, ale które mogą być zmieniane przez zmianę sortowania kolumny .Jeśli zapytanie LINQ jest wykonywane w kontekście .NET, możesz użyć IndexOf () , ale ta metoda nie jest obsługiwana w LINQ to SQL.
LINQ to SQL nie obsługuje metod, które przyjmują CultureInfo jako parametr, prawdopodobnie dlatego, że nie może zagwarantować, że serwer SQL obsługuje takie same kultury jak .NET. To nie jest do końca prawdą, ponieważ tak jest wsparcia
StartsWith(string, StringComparison)
.Wydaje się jednak, że nie obsługuje ona metody, która
LIKE
w LINQ to SQL jest oceniana jako , ani do porównania niewrażliwego na wielkość liter w .NET, co uniemożliwia wykonanie Contains () bez uwzględniania wielkości liter w spójny sposób.źródło
insensitive
wyszukiwać przypadki , aw drugim potrzebuję, aby tak byłocase sensitive
. Czy muszę po prostu przejmować wydajność i używać funkcji „toLower ()”?Przyjęta tutaj odpowiedź nie wspomina o fakcie, że jeśli masz pusty ciąg ToLower (), zgłosi wyjątek. Bezpieczniejszym sposobem byłoby:
źródło
Używając C # 6.0 (który umożliwia funkcje z wyrażeniami i propagację wartości null), dla LINQ to Objects, można to zrobić w jednym wierszu, takim jak ten (również sprawdzanie wartości null):
źródło
IndexOf działa najlepiej w tym przypadku
źródło
Możesz użyć string.Compare
jeśli chcesz tylko sprawdzić zawartość, użyj opcji „Dowolny”
źródło
źródło
źródło
Szczerze mówiąc, to nie musi być trudne. Może się wydawać, że na początku, ale tak nie jest. Oto prosta kwerenda linq w C #, która działa dokładnie zgodnie z żądaniem.
W moim przykładzie pracuję przeciwko liście osób, które mają jedną właściwość o nazwie FirstName.
Spowoduje to przeszukanie bazy danych przy użyciu wyszukiwania małymi literami, ale zwróci pełne wyniki.
źródło
Użyj metody String.Equals
źródło