tutorial mvc framework first español code c# entity-framework

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.