web-dev-qa-db-fra.com

Comme dans Lambda Expression et LINQ

Comment puis-je faire quelque chose comme ça:

customers.where(c=>c.Name **like** "john");

Je sais que ce n'est pas possible mais je me demandais comment puis-je avoir quelque chose de similaire.

38
Stacker
customers.Where(c => c.Name.Contains("john"));
70
Tom Vervoort

Si vous ciblez LINQ to SQL, utilisez SqlMethods.Like :

customers.Where(c => SqlMethods.Like(c.Name, "%john%")); 

Explication:

Le compilateur générera une arborescence d'expression à partir de l'instruction ci-dessus. Étant donné que LIKE est une construction spécifique à SQL et non commune à tous les fournisseurs de requêtes LINQ, la classe SqlMethods et ses membres sont utilisés comme "indice" pour le compilateur d'expressions (compile des arborescences d'expressions en SQL) pour émettre une instruction LIKE.

30
Johannes Rudolph

La première pensée qui me vient à l'esprit est Regex.IsMatch .

Cela se rapprocherait le plus du type de fonctionnalité que vous obtenez de LIKE; par exemple, avec cela, vous pouvez faire ceci:

var matches = people.Where(p => Regex.IsMatch(p.Name, "A.*[mn]"));

foreach (Person match in matches)
{
    Console.WriteLine(match.Name);
}

Et obtenez une sortie comme celle-ci:

 Adam 
 Aaron 
 Aidan 

Aller avec string.Contains comme d'autres l'ont suggéré est presque certainement préférable si votre intention est simplement de rechercher une sous-chaîne spécifique dans Name.

9
Dan Tao
using System.Data.Linq.SqlClient;
...
customers.where(c=>SqlMethods.Like(c.Name, "john"));
5
Andrei

Utilisation Regex.IsMatch dans votre instruction where ou pour une version plus simple sans caractères génériques, etc.:

customers.where(c=>c.Name.Contains("john"));
2
bitbonk

Voici mon code:

string s="somethings";

customers.Where(c => c.Name != null && c.Name.ToLower().Contains(s.ToLower()));

Quelque chose comme ça.

1
asalam345