2017-10-06 1 views
0

Ich habe eine Eigenschaft Name in Einheit UnitType auf Unique für SQLite mit EntityFrameworkCore 2.0 festgelegt.SQLite mit EntityFrameworkCore eindeutige Spalte ist case sensitive. Suche ist auch case sensitive

modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique(); 

Aber es verhält sich wie Groß-und Kleinschreibung. Bedeutet, es betrachtet Gram und gram als zwei verschiedene Werte und fügt sie ein. Das ist eindeutig nicht zu erwarten, nachdem ich viel Zeit mit MS-SQL verbracht habe.

Auch ein weiteres Problem ist beim Filtern von Daten für diese Spalte. Auch das ist Groß-und Kleinschreibung.

db.Units.Where(w => w.Name.Contains(SearchText)); 

Wie es Groß- und Kleinschreibung machen?

Antwort

2

Das Standardverhalten von SQLite unterscheidet zwischen Groß- und Kleinschreibung.

Um eine Spalte als Case-Insensitive zu definieren, muss COLLATE NOCASE verwendet werden.

Also müssen wir diese Zeile auch hinzufügen.

modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE"); 

Dies wird sicherstellen, dass Gram und gram als gleicher Wert verstanden werden und damit eindeutige Einschränkung wird Insertion eines beschränken, wenn andere bereits vorhanden ist.

Zum Filtern gibt es zwei Methoden.

1) Konvertieren Sie sowohl den Spaltenwert als auch den Suchtext in Klein- oder Großbuchstaben.

db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant())); 

2) Verwendung Wie Schlüsselwort mit Wildcard-Zeichen statt enthalten

db.Units.Where(w => EF.Functions.Like(w.Name, $"%{SearchText}%")); 

Auch habe ich irgendwo gelesen, dass die Spalte Umwandlung zu senken oder führt zu einem oberen die Datenbank-Engine alle Werte davon konvertieren Spalte, die Leistungsengpass bei einem großen Dataset sein kann. Daher empfehle ich die zweite Methode.

+0

Für die Suche nach Groß-/Kleinschreibung in SQLite finden Sie auch diese Frage: https://stackoverflow.com/questions/15480319/case-sensitive-and-insensitive-like-in-sqlite –