Estamos tratando de implementar el operador "LIKE" en Entity Framework para nuestras entidades con campos de cadena, pero no parece ser compatible. ¿Alguien más ha intentado hacer algo como esto?
Esta publicación de blog resume el problema que tenemos. Podríamos usar contiene, pero eso solo coincide con el caso más trivial de LIKE. La combinación de contains, startswith, endswith e indexof nos lleva allí, pero requiere una traducción entre comodines estándar y código Linq to Entities.
Respuestas:
Esta es una publicación antigua ahora, pero para cualquiera que busque la respuesta, este enlace debería ayudar. Vaya a esta respuesta si ya está usando EF 6.2.x. A esta respuesta si está usando EF Core 2.x
Version corta:
Método SqlFunctions.PatIndex : devuelve la posición inicial de la primera aparición de un patrón en una expresión especificada, o ceros si no se encuentra el patrón, en todos los tipos de datos de texto y caracteres válidos
Espacio de nombres: System.Data.Objects.SqlClient Ensamblado: System.Data.Entity (en System.Data.Entity.dll)
También aparece una pequeña explicación en este hilo del foro .
fuente
Realmente no sé nada sobre EF, pero en LINQ to SQL generalmente expresas una cláusula LIKE usando String.Contains:
se traduce en
(Uso
StartsWith
yEndsWith
para otro comportamiento).No estoy completamente seguro de si eso es útil, porque no entiendo lo que quiere decir cuando dice que está tratando de implementar LIKE. Si he entendido mal por completo, avíseme y eliminaré esta respuesta :)
fuente
Yo tuve el mismo problema.
Por ahora, me he conformado con el filtrado Wildcard / Regex del lado del cliente basado en http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - es simple y funciona como esperado.
Encontré otra discusión sobre este tema: http://forums.asp.net/t/1654093.aspx/2/10
Esta publicación parece prometedora si usa Entity Framework> = 4.0:
Nota: esta solución es solo para SQL-Server, ya que utiliza una función PATINDEX no estándar.
fuente
Actualización: en EF 6.2 hay un operador similar
fuente
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
?Hay un
LIKE
operador agregado enEntity Framework Core 2.0
:var query = from e in _context.Employees where EF.Functions.Like(e.Title, "%developer%") select e;
Compararlo
... where e.Title.Contains("developer") ...
se traduce en realidad enSQL
LIKE
lugar deCHARINDEX
verlo comoContains
método.fuente
Se menciona específicamente en la documentación como parte de Entity SQL. ¿Está recibiendo un mensaje de error?
// LIKE and ESCAPE // If an AdventureWorksEntities.Product contained a Name // with the value 'Down_Tube', the following query would find that // value. Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name LIKE 'DownA_%' ESCAPE 'A' // LIKE Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name like 'BB%'
http://msdn.microsoft.com/en-us/library/bb399359.aspx
fuente
si está utilizando MS Sql, he escrito 2 métodos de extensión para admitir el carácter% para la búsqueda con comodines. (Se requiere LinqKit)
uso
en ef6 y debería traducirse a
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Hola% ', @ p__linq_2 ='% Activo '
fuente
Para EfCore, aquí hay una muestra para construir una expresión LIKE
fuente
Puede usar un Me gusta real en Enlace a entidades con bastante facilidad
Añadir
a su EDMX en esta etiqueta:
También recuerde el espacio de nombres en el
<schema namespace="" />
atributoLuego agregue una clase de extensión en el espacio de nombres anterior:
Este método de extensión ahora se asignará a la función EDMX.
Más información aquí: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
fuente