58 votos

Como Operador en el Marco de la Entidad?

Estamos tratando de implementar el "COMO" operador en el Marco de la Entidad para nuestras entidades con los campos de cadena, pero no parecen ser compatibles. Ha nadie trató de hacer algo como esto?

Este blog resume el problema que estamos teniendo. Podríamos utilizar la contiene, sino que sólo coincide con los casos más triviales por IGUAL. La combinación de contains, endswith, y indexof nos lleva allí, pero requiere de una traducción entre estándar comodines y Linq to entities código.

95voto

Jon Skeet Puntos 692016

No sé nada acerca de EF realmente, pero en LINQ to SQL se expresan generalmente COMO el uso de la cláusula de la Cadena.Contiene:

where entity.Name.Contains("xyz")

se traduce en

WHERE Name LIKE '%xyz%'

(Uso StartsWith y EndsWith para otro tipo de conducta.)

No estoy del todo seguro de si eso es útil, porque no entiendo a qué te refieres cuando dices que estás intentando implementar GUSTA. Si yo lo he entendido mal completamente, hágamelo saber y voy a borrar esta respuesta :)

25voto

Yann Duran Puntos 2655

Este es un viejo post, pero para cualquier persona en busca de la respuesta, en este enlace:

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.patindex.aspx

SqlFunctions.PatIndex Método - Devuelve la posición inicial de la primera aparición de un patrón en una expresión especificada, o con ceros si el patrón no se encuentra, en todos los válido de texto y tipos de datos de carácter

Espacio De Nombres: System.De datos.Objetos.SqlClient Ensamblado: System.De datos.Entidad (en System.Data.Entity.dll)

Un poco de explicación aparece en este hilo del foro:

http://social.msdn.microsoft.com/Forums/en-US/lightswitch/thread/5ede2db0-a4f9-4178-84c0-fabf4d3a57fa

22voto

surfen Puntos 2703

Yo tenía el mismo problema.

Por ahora, he resuelto con el lado del cliente Comodín/Regex de filtrado basado en la http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - es simple y funciona como se esperaba.

He encontrado otra discusión sobre este tema: http://forums.asp.net/t/1654093.aspx/2/10
Este post parece prometedor si el uso de Entity Framework >= 4.0:

Uso SqlFunctions.PatIndex:

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.patindex.aspx

Como esto:

var q = EFContext.Products.Where(x =>
SqlFunctions.PatIndex("%CD%BLUE%", x.ProductName) > 0);

Nota: esta solución es para SQL-Server, ya que utiliza la no-estándar PATINDEX función.

5voto

Robert Harvey Puntos 103562

Es específicamente mencionado en la documentación como parte de Entity SQL. Recibe 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

1voto

th2tran Puntos 111

re: "nos gustaría ser capaces de encontrar en bla bla foobar foo?barra ?foo*bar? y otro de los patrones complejos." Realmente no he probado este (no necesario), pero, ¿has intentado usar el Sistema.De texto.Clase regularexpressions.RegEx?

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X