Bei diesem Code wird zwischen Groß- und Kleinschreibung unterschieden. Wie wird die Groß- und Kleinschreibung beachtet?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Antworten:
Angenommen, wir arbeiten hier mit Strings, dann ist hier eine andere "elegante" Lösung
IndexOf()
.quelle
quelle
IEqualityComparer<string>
Attribut verwenden, um zu handhaben, wie der Vergleich funktioniert. Verwenden Sie ToLower und ToUpper, um die Gleichheit zu überprüfen. Dies ist eine schlechte Idee. Versuchen Sie:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
zum BeispielError 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
erhält keine Zeichenfolge als Parameter, daher handelt es sich um einen Build-Fehler.IndexOf
onQueryable
kann wahrscheinlich nicht in SQL übersetzt werden. Persönlich fand ich diese Antwort absolut gültig, da wir über LINQ to Database sprechen.Wenn die LINQ-Abfrage im Datenbankkontext ausgeführt
Contains()
wird, wird demLIKE
Operator ein Aufruf von zugeordnet :.Where(a => a.Field.Contains("hello"))
wirdField LIKE '%hello%'
. DerLIKE
Operator unterscheidet standardmäßig nicht zwischen Groß- und Kleinschreibung. Dies kann jedoch durch Ändern der Sortierung der Spalte geändert werden .Wenn die LINQ-Abfrage im .NET-Kontext ausgeführt wird, können Sie IndexOf () verwenden , diese Methode wird jedoch in LINQ to SQL nicht unterstützt.
LINQ to SQL unterstützt keine Methoden , die CultureInfo als Parameter verwenden, wahrscheinlich weil nicht garantiert werden kann, dass der SQL Server Kulturen wie .NET behandelt. Das ist nicht ganz richtig, denn es tut Unterstützung
StartsWith(string, StringComparison)
.Es scheint jedoch keine Methode zu unterstützen, die
LIKE
in LINQ zu SQL und zu einem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung in .NET ausgewertet wird , sodass es unmöglich ist, Contains () ohne Berücksichtigung der Groß- und Kleinschreibung auf konsistente Weise auszuführen.quelle
insensitive
Fallsuche durchführen, und in dem anderen muss es seincase sensitive
. Muss ich nur den Performance-Knock nehmen und 'toLower ()' verwenden?In der hier akzeptierten Antwort wird nicht erwähnt, dass ToLower () eine Ausnahme auslöst, wenn Sie eine Nullzeichenfolge haben. Der sicherere Weg wäre:
quelle
Mit C # 6.0 (das Ausdrucksfunktionen und die Weitergabe von Nullen ermöglicht) kann LINQ to Objects in einer einzigen Zeile wie dieser ausgeführt werden (auch auf Null prüfen):
quelle
IndexOf funktioniert in diesem Fall am besten
quelle
Sie können string.Compare verwenden
Wenn Sie nur die enthaltenen Inhalte überprüfen möchten, verwenden Sie "Beliebig".
quelle
quelle
quelle
Ehrlich gesagt muss das nicht schwierig sein. Es mag so scheinen, als ob es am Anfang wäre, aber es ist nicht so. Hier ist eine einfache Linq-Abfrage in C #, die genau den Anforderungen entspricht.
In meinem Beispiel arbeite ich gegen eine Liste von Personen mit einer Eigenschaft namens Vorname.
Dadurch wird die Datenbank bei der Suche in Kleinbuchstaben durchsucht, es werden jedoch vollständige Ergebnisse in Groß- und Kleinschreibung zurückgegeben.
quelle
Verwenden Sie die String.Equals- Methode
quelle