105 votes

Entité cadre EF.Functions.Like vs string.Contains

J'ai lu l'annonce de l'entity framework core 2.0 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/

Il dit qu'ils ont ajouté de nouvelles fonctions Sql comme EF.Functions.Like pour l'exécution de SQL LIKE de l'opération.

Je me demandais, quelle serait la différence entre l' EF.Functions.Like et string.Contains/StartsWith?

Par exemple:

var customers = context.Customers.Where(c => c.Name.StartsWith("a")); // Version A
var customers = context.Customers.Where(c => EF.Functions.Like(c.Name, "a%")); // Version B

Quelle serait la différence entre les deux versions? EF sait déjà comment traduire string.Contains/StartsWith pour les requêtes SQL correspondant opérations, n'est-ce pas?

La seule raison pour laquelle je peux penser, c'est que EF.Fonctions.Comme le permettrait pour des modèles plus complexes comme "a%b%" (bien que celui-ci peut être écrit comme StartsWith("a") && Contains("b"))

Est-ce la raison?

103voto

adiga Points 16410

Comme la requête prend en charge les caractères génériques et donc très utile par rapport à la chaîne des méthodes d'extension dans certains scénarios.

Ex: Si nous étions à la recherche à tous les 4 lettres pour les noms avec " ri " comme le milieu personnages que l'on pourrait faire EF.Functions.Like(c.Name, "_ri_");

ou pour obtenir tous les clients de villes qui commencent par des voyelles:

var customers = from c in context.Customers
                  where EF.Functions.Like(c.City, "[aeiou]%");
                  select c;

(Veuillez lire @Tseng sa réponse sur la façon dont ils sont traduit différemment dans les requêtes SQL)

101voto

Tseng Points 2687

La réponse de @adiga est très incomplète et ne couvre qu'une partie des différences dans l'utilisation.

Toutefois, .StartsWith(...), .Contains(...) et .EndsWith(...) sont également traduit différemment dans SQL alors EF.Functions.Like.

Par exemple .StartsWith se traduit comme (string LIKE pattern + "%" AND CHARINDEX(pattern, string) = 1) OR pattern = ''.Contains se traduit en (CHARINDEX(pattern, string) > 0) OR pattern = ''.

EF.Functions.Like toutefois se traduit en string LIKE pattern [ESCAPE escapeChar].

Cela peut également avoir des répercussions sur les Performances. Le dessus est valable pour une EF Base SqlServer fournisseur. D'autres EF Base de fournisseurs peut traduire différemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X