2014-05-12 8 views
7

Podczas używania linq do encji wykonujących porównania łańcuchów będą ignorowane białe spacje.Linq do Entity porównując ciągi ignoruje białe przestrzenie

W mojej tabeli mam kolumnę nchar (10), więc wszelkie zapisane dane, jeśli nie ma ona 10 znaków, wypełnią resztę pustymi polami. Poniżej porównuję "ncharTextColumn" z ciągiem "Four". I nawet pomyślał ncharText wyniesie "Four " Wynika to w meczu i zmienna „wynik” będzie zawierać 1 rekord

 TestEntities1 entity = new TestEntities1(); 

     var result = entity.Table_1.Where(e => e.ncharText == "Four"); 

Czy istnieje wyjaśnienie tego i sposób obejść albo ja będziemy musieli zadzwoń do ToList na moje zapytanie przed jakimiś podobnymi komandytami.

var newList = result.ToList().Where(e => e.ncharText == "Four"); 

Ten kod poprawnie zwraca teraz 0 rekordów, ponieważ uwzględnia białe spacje. Jednak wywołanie listy przed porównaniem może spowodować załadowanie dużej kolekcji do pamięci, która nie zostanie użyta.

+1

Nie możesz po prostu zrobić 'e.ncharText.Trim() ==" Cztery "'? –

Odpowiedz

9

This odpowiedź wyjaśnia, dlaczego.

SQL Server następuje SQL-92 specyfikacja ANSI/ISO (sekcja 8.2, Ogólne zasady nr 3) w jaki sposób porównywania ciągów znaków ze spacjami. Standard ANSI wymaga dopełnienia dla ciągów znaków używanych w porównaniach , aby ich długości były zgodne przed porównaniem ich. Podszewka wpływa bezpośrednio na semantykę predykcji WHERE i HAVING klauzuli i innych porównań łańcuchów Transact-SQL. Na przykład: Transact-SQL uznaje łańcuchy "abc" i "abc" za równoważne dla większości operacji porównania.

Jedynym wyjątkiem od tej reguły jest predykat LIKE. Kiedy właściwa strona z wyrażeniem predykatu LIKE ma wartość z końcową przestrzenią , SQL Server nie umieszcza obu wartości na tej samej długości , zanim nastąpi porównanie. Ponieważ celem predykatu LIKE jest, z definicji, ułatwienie wyszukiwania wzorców, a nie niż proste testy równości łańcuchowej, nie narusza to sekcji wspomnianej wcześniej specyfikacji ANSI SQL-92.

Wewnętrznie LINQ właśnie wysyła zapytania SQL do bazy danych.

Powiązane problemy