2014-05-12 16 views
7

Quando si utilizza linq sull'entità, i confronti tra stringhe ignoreranno gli spazi bianchi.Linq a entità che confrontano le stringhe ignora gli spazi bianchi

Nella mia tabella ho una colonna nchar (10) in modo che qualsiasi dato salvato se non è di 10 caratteri riempirà il resto di spazi vuoti. Di seguito sto confrontando "ncharTextColumn" con la stringa "Four". E anche pensato che la ncharText sarà uguale "Four " Essa si traduce in una partita e la variabile "risultato" conterrà 1 registro

 TestEntities1 entity = new TestEntities1(); 

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

C'è una spiegazione per questo e un modo di lavorare intorno ad esso o sto andando ad avere per chiama ToList sulla mia domanda prima di qualsiasi controllo come questo.

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

Questo codice ora restituisce correttamente 0 record poiché tiene conto degli spazi bianchi. Tuttavia, chiamare per elencare prima di un confronto può comportare il caricamento di una grande raccolta in memoria che non verrà utilizzata.

+1

Non potresti semplicemente fare 'e.ncharText.Trim() ==" Quattro "'? –

risposta

9

This risposta spiega perché.

SQL Server segue la specifica ANSI/ISO SQL-92 (Sezione 8.2,, Regole generali # 3) sul modo di confrontare le stringhe con gli spazi. Lo standard ANSI richiede il riempimento per le stringhe di caratteri utilizzate nei confronti in modo che le loro lunghezze corrispondano prima di confrontarle. Il riempimento dello influisce direttamente sulla semantica della clausola WHERE e HAVING dei predicati e di altri confronti tra stringhe Transact-SQL. Ad esempio, Transact-SQL considera le stringhe 'abc' e 'abc' equivalenti a per la maggior parte delle operazioni di confronto.

L'unica eccezione a questa regola è il predicato LIKE. Quando il lato destro di un'espressione di predicato LIKE presenta un valore con uno spazio iniziale , SQL Server non applica i due valori alla stessa lunghezza prima del confronto. Poiché lo scopo del predicato LIKE , per definizione, è di facilitare le ricerche di pattern piuttosto che rispetto ai semplici test di uguaglianza delle stringhe, ciò non viola la sezione della specifica ANSI SQL-92 menzionata in precedenza.

Internamente LINQ esegue solo query SQL sul database.

Problemi correlati