Recherche de génériques pour LINQ
Je voudrais savoir si il est possible de faire une recherche de génériques à l'aide de LINQ.
Je vois LINQ a Contient, StartsWith, EndsWith, etc.
Ce que si je veux quelque chose comme %Test si%il travail%, comment dois-je faire?
Ce qui concerne
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser des Expressions Régulières, car vous pourriez ne pas toujours être à l'aide de Linq to SQL.
Comme cet exemple de Linq to Objects
SqlMethods.Like
est spécifique à LINQ to SQL, pas de LINQ to entities qui pourrait aussi être l'interrogation d'une base de données SQL.Regex
de recherche ne fonctionnera pas avec une.Vous pouvez utiliser SqlMethods.Comme().
Un exemple de l'utilisation:
ajouter un Système.Les données.Linq.SqlClient à votre utilisation ou l'importation de la liste puis essayez:
Pour
Entity Framework Core 2.0
il estLIKE
opérateur (annoncé en août 2017):À la recherche à la question
alors je m'attends à quelque chose de
ce qui signifie que la chaîne doit contenir 'Tester si' et de 'fonctionner', dans cet ordre.
Cela ne fonctionnera pas:
Et si j'utilise:
alors je vais trouver toutes les notices qui contiennent à la fois "Tester si" et "travail", mais pas spécialement dans cet ordre.
Donc, avec Contient ce n'est pas possible. Mais avec IndexOf il est.
IndexOf permettra de localiser l'searchstring ET retourne la position dans la chaîne. Permet de trouver les mots dans le bon ordre.
-- Update --
Avec ma réponse originale à cette question, il n'était pas mon but de fournir une solution générique, mais plutôt un exemple d'une autre approche qui n'est pas sql dependend. Donc, il est exact qu'à l'origine, par exemple, seulement les réponses à la question littérale. Mais depuis que la réponse peut être plus utile si elle est générique, j'ai écrit un IQuerable extension qui permet d'ajouter une déclaration à la requête simple comme un défaut de déclaration. L'extension fonctionne pour les deux Linq comme Linq-Sql.
Cela permettra de trouver tous les enregistrements avec "Test si" et "travail", dans cet ordre.
Extension, permet à n'importe quel nombre de caractères de remplacement:
Car il n'a pas besoin de SqlMethods je suppose que vous pouvez l'utiliser pour toute base de données comme MySql ou Postgresql. Mais je ne sais pas pour sûr. J'ai fait le test avec Sql Server à l'aide de Entity Framework 6. La déclaration ci-dessus génère le code suivant dans Sql Server.
Sur la performance, il semble y avoir une discussion sur ce qui est "mieux": COMME ou CHARINDEX. Et à partir de ce que j'ai lu CHARINDEX semble être un favori.
De travail pour les deux Linq to SQL et Linq dans la mémoire.
Je sais que c'est et ce vieux sujet, mais voici ma solution très simple:
Dans ce code, je suis en utilisant des caractères d'échappement pour le langage SQL.
Si vous souhaitez utiliser le dire
*
et?
, a échappé à la chaîne contiendra\*
et\?
en conséquence, assurez-vous d'inclure les barre oblique inverse personnage dans le.Replace(...)
déclaration(s).Bien sûr, si vous voulez donner à vos utilisateurs la possibilité d'RexEx de recherche, il suffit de ne pas échapper à la chaîne de modèle.
De recherche Regex tutoriel pour d'autres options.
Je crois que normalement
%
correspondra au moins un caractère, tandis que la RegEx.*
correspondra zéro ou plus caractères. Donc, en réalité, la%
générique est plus comme.+
(gourmand) plutôt que de.*
(paresseux).Espère que cette aide.
ne sais pas si vous parlez LinqToSql ou tout simplement linq... mais vous pouvez les expressions régulières comme ceci:
Dans .Net code, y compris LINQ to Objects, je suis à l'aide de la mise en œuvre de IsSqlLikeMatch fonction de thread En utilisant les Regex pour créer un SQL "j'aime" comme une fonction..
Exemple d'utilisation
Plus de détails dans mon post
SQL "j'aime" de modèles pour comparer en .Net
Vous pouvez également utiliser "contient"
Parlez-vous de LINQ to objects ou LINQ to SQL?
LINQ to objects, vous devrez recourir à les expressions régulières de moi pense.
- Je l'utiliser pour soutenir un filtre générique de "*" dans la recherche d'un utilisateur. (l'ordre n'a pas d'importance):