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%';
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'));
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
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'));
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%")));