Nous essayons d'implémenter l'opérateur "LIKE" dans Entity Framework pour nos entités avec des champs de chaîne, mais il ne semble pas être pris en charge. Quelqu'un d'autre a-t-il essayé de faire quelque chose comme ça?
Cet article de blog résume le problème que nous rencontrons. Nous pourrions utiliser contient, mais cela ne correspond qu'au cas le plus trivial de LIKE. Combiner contient, commence par, se termine par et indexof nous y conduit, mais nécessite une traduction entre les caractères génériques standard et le code Linq en entités.
Réponses:
Ceci est un ancien article maintenant, mais pour quiconque cherche la réponse, ce lien devrait aider. Accédez à cette réponse si vous utilisez déjà EF 6.2.x. À cette réponse si vous utilisez EF Core 2.x
Version courte:
Méthode SqlFunctions.PatIndex - renvoie la position de départ de la première occurrence d'un modèle dans une expression spécifiée, ou des zéros si le modèle n'est pas trouvé, sur tous les types de données texte et caractère valides
Espace de noms: System.Data.Objects.SqlClient Assembly: System.Data.Entity (dans System.Data.Entity.dll)
Une petite explication apparaît également dans ce fil de discussion .
la source
Je ne sais vraiment rien sur EF, mais dans LINQ to SQL, vous exprimez généralement une clause LIKE en utilisant String.
Se traduit par
(Utilisez
StartsWith
etEndsWith
pour un autre comportement.)Je ne suis pas tout à fait sûr que cela soit utile, car je ne comprends pas ce que vous voulez dire quand vous dites que vous essayez d' implémenter LIKE. Si j'ai complètement mal compris, faites-le moi savoir et je supprimerai cette réponse :)
la source
J'ai eu le même problème.
Pour l'instant, j'ai opté pour le filtrage Wildcard / Regex côté client basé sur http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - c'est simple et fonctionne comme attendu.
J'ai trouvé une autre discussion sur ce sujet: http://forums.asp.net/t/1654093.aspx/2/10
Cet article semble prometteur si vous utilisez Entity Framework> = 4.0:
Remarque: cette solution est réservée à SQL-Server, car elle utilise la fonction PATINDEX non standard.
la source
Mise à jour: dans EF 6.2, il existe un opérateur similaire
la source
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
?Un
LIKE
opérateur est ajouté dansEntity Framework Core 2.0
:Comparé à
... where e.Title.Contains("developer") ...
cela, il est vraiment traduitSQL
LIKE
plutôt queCHARINDEX
nous ne voyons laContains
méthode.la source
Il est spécifiquement mentionné dans la documentation dans le cadre d'Entity SQL. Recevez-vous un message d'erreur?
http://msdn.microsoft.com/en-us/library/bb399359.aspx
la source
si vous utilisez MS Sql, j'ai écrit 2 méthodes d'extension pour prendre en charge le caractère% pour la recherche générique. (LinqKit est requis)
usage
dans ef6 et cela devrait se traduire par
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Salut% ', @ p__linq_2 ='% Active '
la source
Pour EfCore, voici un exemple pour construire une expression LIKE
la source
Vous pouvez utiliser un réel comme dans Link to Entities assez facilement
Ajouter
à votre EDMX dans cette balise:
Souvenez-vous également de l'espace de noms dans l'
<schema namespace="" />
attributAjoutez ensuite une classe d'extension dans l'espace de noms ci-dessus:
Cette méthode d'extension sera désormais mappée à la fonction EDMX.
Plus d'infos ici: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
la source