c# - mvc - Entity framework EF.Functions.Like vs string.Contains
entity framework tutorial español c# pdf (2)
Estaba leyendo el anuncio de entidad framework core 2.0 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/
Dice que agregaron nuevas funciones Sql como EF.Functions.Like
igual que para realizar la operación SQL LIKE
.
Me preguntaba, ¿cuál sería entonces la diferencia entre EF.Functions.Like
y string.Contains
/ StartsWith
?
Por ejemplo:
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
¿Cuál sería la diferencia entre las dos versiones? EF ya sabe cómo traducir string.Contains
/ StartsWith
a las operaciones de SQL correspondientes, ¿no es así?
La única razón por la que puedo pensar es que EF.Functions.Like permitiría patrones más complejos como "a%b%"
(aunque este se puede escribir como StartsWith("a") && Contains("b")
)
¿Es esta la razón?
La consulta Like admite caracteres comodín y, por lo tanto, es muy útil en comparación con los métodos de extensión de cadena en algunos escenarios.
Por ejemplo: si EF.Functions.Like(c.Name, "_ri_");
todos los nombres de 4 letras con ''ri'' como los caracteres intermedios podríamos hacer EF.Functions.Like(c.Name, "_ri_");
o para obtener todos los clientes de ciudades que comienzan con vocales:
var customers = from c in context.Customers
where EF.Functions.Like(c.City, "[aeiou]%");
select c;
La respuesta de @adiga es bastante incompleta y cubre solo una parte de las diferencias de uso.
Sin embargo, .StartsWith(...)
, .Contains(...)
y .EndsWith(...)
también se traducen de manera diferente en SQL que EF.Functions.Like
.
Por ejemplo .StartsWith
se traduce como (string LIKE pattern + "%" AND CHARINDEX(pattern, string) = 1) OR pattern = ''''
donde .Contains
se traduce a (CHARINDEX(pattern, string) > 0) OR pattern = ''''
.
EF.Functions.Like
sin embargo, se traduce en el string LIKE pattern [ESCAPE escapeChar]
.
Esto también puede tener implicaciones en el rendimiento. Lo anterior es válido para el proveedor EF Core SqlServer . Otros proveedores de EF Core pueden traducirlo de manera diferente.