412 votes

Comment faire du SQL Like % dans Linq ?

J'ai une procédure en SQL que j'essaie de transformer en Linq :

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

La ligne qui me préoccupe le plus est la suivante :

where OH.Hierarchy like '%/12/%'

J'ai une colonne qui stocke la hiérarchie comme /1/3/12/ par exemple, donc j'utilise simplement %/12/% pour la rechercher.

Ma question est la suivante : quel est l'équivalent en Linq ou en .NET de l'utilisation du signe pour cent ?

1 votes

Votre question a au moins 5 votes pour le comme-opérateur tag. Puis-je vous demander de bien vouloir suggérer de type sql en tant que synonyme ?

0 votes

Il n'est pas clair si un équivalent LINQ-to-Objects est recherché. Si c'est le cas, la balise linq-to-entities n'est pas pertinente et prête même à confusion.

587voto

andleer Points 12090
.Where(oh => oh.Hierarchy.Contains("/12/"))

Vous pouvez également utiliser .StartsWith() ou .EndsWith() .

5 votes

L'utilisation de StartsWith() ou EndsWith() déclenchera-t-elle une requête ? Je veux dire, le code sera-t-il traduit en une requête ou les résultats seront-ils filtrés dans l'objet après avoir été récupérés dans la base de données ?

5 votes

Non. StartsWith() et EndsWith() font partie du prédicat / filtre. L'exécution continue d'être différée.

2 votes

J'ai essayé et j'ai obtenu une NullReferenceException : Object reference not set to an instance of an object. Donc il n'aime pas quand dans mon cas a.Address1.StartsWith(Address1) et a.Address1 est null.

262voto

L P Points 1299

Utilisez ça :

from c in dc.Organization
where SqlMethods.Like(c.Hierarchy, "%/12/%")
select *;

23 votes

Ceci est vraiment utile si vous voulez utiliser la correspondance de motifs plus complexe fournie par la commande like. Par exemple, si vous voulez vérifier la présence de deux nombres quelconques (au lieu de 12), vous pouvez utiliser cette expression : SqlMethods.Like(c.Hierarchy, "%/[0-9][0-9]/%") Voir également ceci msdn.microsoft.com/fr/us/library/aa933232(SQL.80).aspx

1 votes

Cette fonction est également très utile si vous souhaitez permettre aux utilisateurs expérimentés de préinstaller eux-mêmes le % initial coûteux, alors que l'utilisation de StartsWith ou de Contains ne leur offre pas cette flexibilité.

9 votes

Comment utilisez-vous SqlMethods en utilisant la "notation par points" ?

43voto

KristoferA Points 8036

Je suppose que vous utilisez Linq-to-SQL* (voir note ci-dessous). Si c'est le cas, utilisez string.Contains, string.StartsWith et string.EndsWith pour générer du SQL qui utilise l'opérateur SQL LIKE.

from o in dc.Organization
join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId
where oh.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

ou

from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

Note : * Si vous utilisez ADO.Net Entity Framework (EF / L2E) dans .net 3.5, sachez qu'il ne fera pas la même traduction que Linq-to-SQL. Bien que L2S effectue une traduction correcte, L2E v1 (3.5) traduira en une expression t-sql qui forcera un balayage complet de la table que vous interrogez, à moins qu'il n'existe un meilleur discriminateur dans votre clause where ou vos filtres de jointure.
Mise à jour : Ce problème a été corrigé dans EF/L2E v4 (.net 4.0). Il génère donc un LIKE SQL comme le fait L2S.

0 votes

Pas besoin d'échapper à vos cordes avec le @ mais je réalise que c'est peut-être juste une bonne convention à suivre.

29voto

robertz Points 515

Si vous utilisez VB.NET, la réponse est "*". Voici à quoi ressemblerait votre clause where...

Where OH.Hierarchy Like '*/12/*'

Remarque : "*" correspond à zéro ou plusieurs caractères. Voici l'article msdn pour l'opérateur Like .

0 votes

L'opérateur VB Like se traduit-il par des appels L2S ? (Je n'en ai aucune idée.)

8 votes

Oui, l'opérateur VB Like est traduit en version SQL de like lorsqu'il est utilisé dans une expression de requête LINQ. De plus, l'opérateur VB Like n'est pas limité aux expressions de requête.

1 votes

J'ai vu qu'il existait en dehors des opérations LINQ. C'est bien. +1

16voto

Jenda Points 157

Au cas où vous en auriez besoin dans LINQ to Entities, voici comment : http://jendaperl.blogspot.com/2011/02/like-in-linq-to-entities.html

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