110 votes

Comme opérateur dans Entity Framework?

Nous essayons de mettre en œuvre le "COMME" de l'opérateur dans le Cadre de l'Entité pour nos sociétés avec des champs de type chaîne, mais il ne semble pas être pris en charge. Quelqu'un d'autre a essayé de faire quelque chose de ce genre?

Ce blog résume la question que nous allons avoir. On pourrait utiliser les contient, mais qui ne correspond à la plupart des cas trivial pour COMME. Combinant contient, startswith, endswith, et indexof nous fait là, mais exige une traduction entre le standard des caractères génériques et Linq to entities code.

171voto

Jon Skeet Points 692016

Je ne sais rien à propos de EF vraiment, mais dans LINQ to SQL, vous expriment habituellement une clause LIKE avec de la Ficelle.Contient:

where entity.Name.Contains("xyz")

se traduit par

WHERE Name LIKE '%xyz%'

(Utiliser StartsWith et EndsWith pour les autres comportements.)

Je ne suis pas entièrement sûr de savoir si c'est utile, parce que je ne comprends pas ce que vous voulez dire quand vous dites que vous essayez de mettre en œuvre le souhaitez. Si j'ai mal compris complètement, laissez-moi savoir et je vais supprimer cette réponse :)

43voto

Yann Duran Points 2655

C'est un vieux post, mais pour ceux qui cherchent la réponse, ce lien devrait vous aider:

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

SqlFunctions.PatIndex Méthode : Renvoie la position de départ de la première occurrence d'un motif dans une expression spécifiée, ou des zéros si le motif n'est pas trouvé, sur tout le texte valide et le caractère des types de données

Espace De Noms: System.Les données.Objets.SqlClient Assembly: System.Les données.Entité (dans System.Data.Entity.dll)

Un peu d'explication apparaît dans ce fil du forum:

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

37voto

surfen Points 2703

J'ai eu le même problème.

Pour l'instant, j'ai installé côté client Générique/Regex filtrage basé sur http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - c'est simple et fonctionne comme prévu.

J'ai trouvé une autre discussion sur ce sujet: http://forums.asp.net/t/1654093.aspx/2/10
Ce post a l'air prometteur si vous utiliser Entity Framework >= 4.0:

Utilisation SqlFunctions.PatIndex:

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

Comme ceci:

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

Remarque: cette solution est pour SQL-Server seulement, car il utilise non-standard PATINDEX fonction.

5voto

Robert Harvey Points 103562

Il est spécifiquement mentionné dans la documentation dans le cadre d'Entity SQL. Recevez-vous un message d'erreur?

 // 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

0voto

th2tran Points 111

re: "nous aimerions pouvoir faire correspondre bla blah foo bar foo? bar? foo * bar? et d'autres motifs complexes." Je n'ai pas réellement essayé cela (je n'ai pas encore eu besoin de le faire), mais avez-vous essayé d'utiliser System.Text.RegularExpressions.RegEx?

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