web-dev-qa-db-fra.com

Utiliser l'opérateur SQL LIKE dans C # LINQ

Je construis une requête en C #. Pour les champs entier et chaîne, la casse est assez simple. Pour les champs de date, j'utilise la requête suivante:

list.Where("myDateColumn >= DateTime(2017,1,20)");

Comment puis-je effectuer la requête SQL LIKE suivante dans LINQ?

select * from table where myTextColumn LIKE '%abc%';
6
Behzad Qureshi

Il existe de nombreuses possibilités pour Like à Linq:

Pour LIKE '% abc%';

list.Where(x => x.myTextColumn.Contains('abc'));

Pour LIKE 'abc%';

list.Where(x => x.myTextColumn.StartWith('abc'));

Pour LIKE '% abc';

list.Where(x => x.myTextColumn.EndsWith('abc'));

Mises à jour: Si vous devez également ajouter une comparaison de date, vous pouvez faire ce qui suit:

DateTime date2Compare = new DateTime(2017, 1, 20);
list.Where(x => myDateColumn >= date2Compare && x.myTextColumn.Contains('abc'));
22
sujith karivelil

Le placement du caractère générique '%' dans une clause LIKE fait une différence, et C # a les méthodes pour le sauvegarder. Vous trouverez ci-dessous ce que les emplacements du Wildcard signifient.

COMME '% abc'

Signification: Trouvez n'importe quel mot se terminant par 'abc'.

équivalent C #: EndsWith

COMME 'abc%'

Signification: Trouvez n'importe quel mot commençant par 'abc', et vous ne vous souciez pas du texte après.

équivalent C #: StartWith

COMME '% abc%'

Signification: Trouvez n'importe quel mot qui contient 'abc', et vous ne vous souciez pas où dans le mot il apparaît.

équivalent C #: Contains

5
monstertjie_za

Vous pouvez utiliser Contient avec le champ myTextColumn

var date = new DateTime(2017,1,20);
list.Where(x => x.myDateColumn >= date  && x.myTextColumn.Contains('abc'));
2
Satpal

Essayons de résoudre le problème dans cas général. Supposons qu'on nous donne quelque chose comme

select ...
 where ... MyField like '%abc%'

nous pouvons essayer de convertir l'expression comme en une expression régulière correspondante:

Like | Description                       |Regular
-------------------------------------------------
   _ | any character  (one and only one) | .
   % | any characters (zero or more)     | .*

La mise en oeuvre

// If you want to implement both "*" and "?"
private static String LikeToRegular(String value) {
  return "^" + Regex.Escape(value).Replace("_", ".").Replace("%", ".*") + "$"; 
}

usage:

var result list
  .Where(x => Regex.IsMatch(x.myTextColumn, LikeToRegular("%abc%")));

vous voudrez peut-être convertir les données en string avant de faire correspondre:

 var result list
  .Where(x => Regex.IsMatch(x.myDate.ToString(), LikeToRegular("%abc%")));
1
Dmitry Bychenko