Dies ist kein Vergleich zwischen Groß- und Kleinschreibung in LINQ und Entitäten:
Thingies.First(t => t.Name == "ThingamaBob");
Wie kann ich einen Vergleich zwischen Groß- und Kleinschreibung mit LINQ to Entities erzielen?
c#
.net
entity-framework-4
linq-to-entities
Ronnie Overby
quelle
quelle
Antworten:
Dies liegt daran, dass Sie LINQ To Entities verwenden, mit dem Ihre Lambda-Ausdrücke letztendlich in SQL-Anweisungen konvertiert werden. Dies bedeutet, dass die Groß- und Kleinschreibung Ihrem SQL Server ausgeliefert ist, der standardmäßig über die SQL_Latin1_General_CP1_CI_AS-Kollatierung verfügt und bei der NICHT zwischen Groß- und Kleinschreibung unterschieden wird.
Die Verwendung von ObjectQuery.ToTraceString zum Anzeigen der generierten SQL-Abfrage, die tatsächlich an SQL Server gesendet wurde , enthüllt das Rätsel:
Wenn Sie eine LINQ to Entities- Abfrage erstellen , nutzt LINQ to Entities den LINQ-Parser, um mit der Verarbeitung der Abfrage zu beginnen und sie in einen LINQ-Ausdrucksbaum zu konvertieren. Der LINQ-Ausdrucksbaum wird dann an die Object Services- API übergeben, die den Ausdrucksbaum in einen Befehlsbaum konvertiert. Es wird dann an den Speicheranbieter (z. B. SqlClient) gesendet, der den Befehlsbaum in den nativen Datenbankbefehlstext konvertiert. Die Abfrage wird im Datenspeicher ausgeführt und die Ergebnisse werden von Object Services in Entitätsobjekte materialisiert. Dazwischen wurde keine Logik eingefügt, um die Groß- und Kleinschreibung zu berücksichtigen. Unabhängig davon, in welchem Fall Sie Ihr Prädikat eingeben, wird es von Ihrem SQL Server immer als gleich behandelt, es sei denn, Sie ändern Ihre SQL Server-Sortierungen für diese Spalte.
Serverseitige Lösung:
Daher besteht die beste Lösung darin, die Sortierung der Spalte Name in der Thingies- Tabelle in COLLATE Latin1_General_CS_AS zu ändern. Dabei wird zwischen Groß- und Kleinschreibung unterschieden, indem Sie dies auf Ihrem SQL Server ausführen :
Weitere Informationen zu den SQL Server-Sortierungen finden Sie unter SQL Server-Sortierung Groß- und Kleinschreibung beachten
Client-seitige Lösung:
Die einzige Lösung, die Sie auf der Clientseite anwenden können, besteht darin, LINQ to Objects zu verwenden, um einen weiteren Vergleich durchzuführen, der nicht sehr elegant zu sein scheint:
quelle
Sie können eine [CaseSensitive] -Anmerkung für EF6 + Code-first hinzufügen
Fügen Sie diese Klassen hinzu
Ändern Sie Ihren DbContext, fügen Sie hinzu
Dann mach
Add-Migration CaseSensitive
Datenbank auf den neusten Stand bringen
basierend auf Artikel https://milinaudara.wordpress.com/2015/02/04/case-sensitive-search-using-entity-framework-with-custom-annotation/ mit einigen Fehlerkorrekturen
quelle
WHERE
Bei Bedingungen in SQL Server wird standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt. Ändern Sie die Groß- und Kleinschreibung, indem Sie die Standardkollatierungen (SQL_Latin1_General_CP1_CI_AS
) der Spalte in ändernSQL_Latin1_General_CP1_CS_AS
.Der fragile Weg, dies zu tun, ist mit Code. Fügen Sie eine neue Migrationsdatei hinzu und fügen Sie diese dann in die
Up
Methode ein:Aber
Mit den neuen EF6-Funktionen können Sie benutzerdefinierte Anmerkungen mit dem Namen "CaseSensitive" erstellen und Ihre Eigenschaften wie folgt dekorieren:
In diesem Blogbeitrag wird erklärt, wie das geht.
quelle
Die Antwort von @Morteza Manavi löst das Problem. Für eine clientseitige Lösung wäre ein eleganter Weg jedoch der folgende (Hinzufügen einer doppelten Prüfung).
quelle
Ich mochte Mortezas Antwort und würde es normalerweise vorziehen, sie auf der Serverseite zu reparieren. Für die Client-Seite verwende ich normalerweise:
Überprüfen Sie zunächst, ob es einen Benutzer mit den erforderlichen Kriterien gibt, und prüfen Sie dann, ob das Kennwort identisch ist. Ein bisschen langatmig, aber ich denke, es ist einfacher zu lesen, wenn es eine ganze Reihe von Kriterien gibt.
quelle
Keiner von beiden
StringComparison.IgnoreCase
hat für mich funktioniert. Aber das tat:quelle
How can I achieve case sensitive comparison
Verwenden Sie string.Equals
Außerdem müssen Sie sich keine Sorgen um Null machen und nur die gewünschten Informationen zurückerhalten.
Verwenden Sie StringComparision.CurrentCultureIgnoreCase für Groß- und Kleinschreibung.
quelle
Ich bin mir bei EF4 nicht sicher, aber EF5 unterstützt dies:
quelle
StringComparison
Aufzählungen nicht dazu bringen, einen Unterschied zu machen. Ich habe genug Leute gesehen, die vorgeschlagen haben, dass so etwas funktionieren sollte, um zu glauben, dass das Problem irgendwo in der EDMX-Datei (db-first) liegt, obwohl stackoverflow.com/questions/841226/…