Comment utiliser SQL "LIKE" avec LINQ to entities?
J'ai une zone de texte qui permet à l'utilisateur de spécifier une chaîne de recherche, y compris les cartes, par exemple:
Joh*
*Johnson
*mit*
*ack*on
Avant à l'aide de LINQ to entities, j'ai eu une procédure stockée qui a pris cette chaîne de caractères comme paramètre et n':
SELECT * FROM Table WHERE Name LIKE @searchTerm
Et puis je voudrais juste faire une Chaîne de caractères.Replace('*', '%') avant de les passer en.
Maintenant avec LINQ to entities, je suis en train de faire la même chose. Je sais qu'il est StartsWith, EndsWith et Contient la prise en charge, mais il ne le supportent pas de la manière dont j'ai besoin.
J'ai lu à propos de "SqlMethods.Comme" et essayé ceci:
var people = from t in entities.People
where SqlMethods.Like(t.Name, searchTerm)
select new { t.Name };
Cependant, je suis l'exception suivante:
LINQ to Entities does not recognize the method 'Boolean Like(System.String,
System.String)' method, and this method cannot be translated into a store
expression.
Comment aurais-je obtenir cette même fonctionnalité à l'aide de LINQ to entities?
Vous devez vous connecter pour publier un commentaire.
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/6529a35b-6629-44fb-8ea4-3a44d232d6b9/
searchTerm
.Façon de l'obtenir pour fonctionner de manière transparente:
dans votre modèle EDMX, ajouter:
juste après les sections qui commencent:
<edmx:ConceptualModels>
<Schema Namespace="Your.Namespace"...
Puis, n'importe où dans votre code, ajoutez cette méthode d'extension:
Et là vous l'avez.
Maintenant vous pouvez le faire:
ou
from ... where ... like
.Bien, vos choix sont:
Contains
. Je sais que vous n'aimez pas ça, mais il pourrait probablement être fait au travail.Contains
,StartsWith
, etEndsWith
vous pouvez choisir les caractères génériques dont vous avez besoin. Je crois que couvre l'ensemble de votre cas.Vous pouvez faire ceci:
parce que Linq to
Entity
ne peut pas transformer la méthodeContains()
pour le SQL, mais Linq to SQL peuvent le faire. J'ai essayé de trouver une méthode qui peut faire un casting, enfin,AsQueryable()
, également une version génériqueAsQueryable<T>()
. J'ai trouvé que je peux le faire à l'aide de cette façon dans mon cas, mais n'importe quel effet secondaire qu'il a je ne sais pas, peut-être qu'il va perdre une partie de la fonctionnalité àEntity
.la solution est d'utiliser SQLFunctions.PatIndex
où "searchstring' est le motif de recherche
'fieldtoSearch' est le terrain à la recherche
Patindex() prend en charge la recherche en utilisant le patron de la chaîne de recherche. La recherche est insensible à la casse.
EDIT - j'ai peut-être un mélange de syntaxe. J'ai l'habitude d'utiliser des méthodes d'extension; mais contient de travail.
Maintenant, EF prend en charge les "j'AIME" d'utilisation et vous pouvez utiliser toutes les sql des caractères génériques. Vérifier cela.
Vous pouvez faire toutes ces déclarations avec LINQ comme ce
Vous n'avez pas besoin d'utiliser le signe pour cent, tandis que le filtrage. e.g;
si je veux vérifier le nom de l'élément ne contient pas '-' je vais faire comme cela
!De l'élément.Nom de l'élément.Contient("-")
En SQL il vous permet de convertir de ne PAS LIKE '%-%'
Nous utilisons la Base de données de la Première et de la EntityFramework.
La "Carte de votre propre fonction." est une approche qui fonctionne pour nous avec le nuget EntityFramework.CodeFirstStoreFunctions.
Étape 1: Créer une fonction dans la base de données comme ceci:
2 Étape: Installer nuget EntityFramework.CodeFirstStoreFunctions
3 Étape: Créer une méthode dans votre code comme ceci (j'ai créer le mien dans la classe DbContext):
4 Étape: Initalize EntityFramework.CodeFirstStoreFunctions.
Étape 5: Maintenant, vous pouvez utiliser cette méthode dans votre requête linq.
Il est facilement atteint par des méthodes suivantes
Utiliser les spécifications suivantes pour obtenir des caractères génériques