Entitätsframework EF.Functions.Like vs string.Contains

8

Ich habe die Ankündigung von Entity Framework Core 2.0 gelesen Ссылка

Es heißt, dass sie neue Sql-Funktionen wie EF.Functions.Like hinzugefügt haben, um die Operation SQL LIKE auszuführen.

Ich frage mich, was wäre dann der Unterschied zwischen EF.Functions.Like und string.Contains / StartsWith ?

Zum Beispiel:

%Vor%

Was wäre der Unterschied zwischen den beiden Versionen? EF weiß bereits, wie man string.Contains / StartsWith in die entsprechenden SQL-Operationen übersetzt, oder?

Der einzige Grund, an den ich denken kann, ist, dass EF.Functions.Like komplexere Muster wie "a%b%" ermöglichen würde (obwohl dieser als StartsWith("a") && Contains("b") geschrieben werden kann)

Ist das der Grund?

    
areller 16.08.2017, 08:31
quelle

2 Antworten

11

Like query unterstützt Platzhalterzeichen und ist daher in einigen Szenarien sehr nützlich im Vergleich zu den String-Erweiterungsmethoden.

Zum Beispiel: Wenn wir alle 4 Buchstabennamen mit 'ri' als mittlere Zeichen suchen würden, könnten wir EF.Functions.Like(c.Name, "_ri_");

machen

oder um alle Kunden von Städten zu bekommen, die mit Vokalen beginnen:

%Vor%     
adiga 16.08.2017, 09:08
quelle
9

Die Antwort von @adiga ist ziemlich unvollständig und deckt nur einen Teil der Unterschiede in der Benutzung ab.

.StartsWith(...) , .Contains(...) und .EndsWith(...) werden jedoch auch anders in SQL übersetzt als EF.Functions.Like .

Zum Beispiel wird .StartsWith als (string LIKE pattern + "%" AND CHARINDEX(pattern, string) = 1) OR pattern = '' übersetzt, wobei .Contains in (CHARINDEX(pattern, string) > 0) OR pattern = '' übersetzt wird.

EF.Functions.Like wird jedoch in string LIKE pattern [ESCAPE escapeChar] übersetzt.

Dies kann sich auch auf die Leistung auswirken. Das oben genannte gilt für den Anbieter EF Core SqlServer . Andere EF Core-Anbieter können es anders übersetzen.

    
Tseng 20.10.2017 13:54
quelle

Tags und Links