Gibt es eine Möglichkeit, Zeichenfolgen in einem C # LINQ-Ausdruck zu vergleichen, der dem SQL- LIKE
Operator ähnelt ?
Angenommen, ich habe eine Zeichenfolgenliste. Auf dieser Liste möchte ich eine Zeichenfolge suchen. In SQL könnte ich schreiben:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
Anstelle der oben genannten Abfrage möchte eine Linq-Syntax.
using System.Text.RegularExpressions;
…
var regex = new Regex(sDischargePort, RegexOptions.IgnoreCase);
var sPortCode = Database.DischargePorts
.Where(p => regex.IsMatch(p.PortName))
.Single().PortCode;
Meine obige LINQ-Syntax funktioniert nicht. Was habe ich falsch gemacht?
Antworten:
Normalerweise verwenden Sie
String.StartsWith
/EndsWith
/Contains
. Beispielsweise:Ich weiß nicht, ob es eine Möglichkeit gibt, korrekte reguläre Ausdrücke über LINQ to SQL zu erstellen. (Beachten Sie, dass es wirklich davon abhängt, welchen Anbieter Sie verwenden. In LINQ to Objects ist dies in Ordnung. Es kommt darauf an, ob der Anbieter den Aufruf in sein natives Abfrageformat konvertieren kann, z. B. SQL.)
BEARBEITEN: Wie BitKFu sagt,
Single
sollte verwendet werden, wenn Sie genau ein Ergebnis erwarten - wenn es ein Fehler ist, dass dies nicht der Fall ist. OptionenSingleOrDefault
,FirstOrDefault
oderFirst
sollten je nach verwendet werden , genau , was erwartet wird .quelle
Single()
,SingleOrDefault()
wäre mein nächster Schritt, es sei denn, wir verstehen den vollständigen Kontext ...Regex? Nein. Aber für diese Abfrage können Sie einfach verwenden:
Wenn Sie wirklich SQL möchten
LIKE
, können Sie das verwendenSystem.Data.Linq.SqlClient.SqlMethods.Like(...)
, dem LINQ-to-SQLLIKE
in SQL Server zugeordnet ist.quelle
Nun ... manchmal kann es unangenehm sein, die Funktion zu verwenden
Contains
,StartsWith
oderEndsWith
insbesondere, wenn derLIKE
Suchwert die Aussage bestimmt, z. B. die vom Entwickler übergebene 'Wert%', um dieStartsWith
Funktion im Ausdruck zu verwenden. Also habe ich beschlossen, eine Erweiterung fürIQueryable
Objekte zu schreiben .Verwendung
Code
quelle
IEnumerable
?Wie Jon Skeet und Marc Gravell bereits erwähnt haben, können Sie einfach eine Contain-Bedingung annehmen. Bei einer ähnlichen Abfrage ist es jedoch sehr gefährlich, eine Single () - Anweisung zu verwenden, da dies bedeutet, dass Sie nur 1 Ergebnis finden. Bei weiteren Ergebnissen erhalten Sie eine nette Ausnahme :)
Daher würde ich lieber FirstOrDefault () anstelle von Single () verwenden:
quelle
In nativem LINQ können Sie eine Kombination aus
Contains/StartsWith/EndsWith
oder RegExp verwenden.Verwenden Sie in LINQ2SQL die Methode
SqlMethods.Like()
Fügen Sie Assembly: System.Data.Linq (in System.Data.Linq.dll) hinzu, um diese Funktion zu verwenden.
quelle
StartsWith()
,Contains()
usw. Sie nicht die Arbeit mit Linq2SQL (zumindest ich „The LINQ Ausdruck ... kann nicht übersetzt werden ...“ und eine Anweisung zum Gebrauch ToList () für „Client - Bewertung“ -Welche I‘ Ich mache es bereits. Beachten Sie, dass es in EF Core aufEF.Functions.Like()
Dies funktioniert wie "LIKE" von SQL ...
quelle
So einfach ist das
Ergebnis -> Annick, Yannick
quelle
Sie können die einzelne Methode mit einem Prädikat aufrufen:
quelle
Idealerweise sollten Sie
StartWith
oder verwendenEndWith
.Hier ist ein Beispiel:
quelle
quelle
Fügen Sie einfach Methoden zur Erweiterung von Zeichenfolgenobjekten hinzu.
Verwendung:
quelle
quelle