Je construis une requête linq qui va vérifier si une chaîne dans la base de données contient l'une des chaînes dans une liste de chaînes.
Quelque chose comme.
query = query.Where(x => x.tags
.Contains(--any of the items in my list of strings--));
J'aimerais également savoir combien d'éléments de la liste ont été appariés.
Toute aide serait appréciée.
Mise à jour: J'aurais dû mentionner que les balises sont une chaîne et non une liste. Et j'ajoute quelques éléments supplémentaires qui ne sont pas liés aux balises avant que la requête ne soit exécutée. Cela fonctionne contre le cadre de l'entité.
EDIT: Cette réponse supposait que tags
était une collection de chaînes ...
On dirait que vous voudrez peut-être:
var list = new List<string> { ... };
var query = query.Where(x => x.tags.Any(tag => list.Contains(tag));
Ou:
var list = new List<string> { ... };
var query = query.Where(x => x.tags.Intersect(list).Any());
(Si cela utilise LINQ to SQL ou EF, vous pouvez en trouver une qui fonctionne mais pas l’autre. Dans LINQ to Objects, les deux devraient fonctionner.)
Pour obtenir le décompte, vous avez besoin de quelque chose comme:
var result = query.Select(x => new { x, count = x.tags.Count(tag => list.Contains(tag)) })
.Where(pair => pair.count != 0);
Alors chaque élément de result
est une paire de x
(l'élément) et count
(le nombre de balises correspondantes).
J'ai déjà fait quelque chose comme ça avant:
var myList = new List<string>();
myList.Add("One");
myList.Add("Two");
var matches = query.Where(x => myList.Any(y => x.tags.Contains(y)));
comme ça:
List<string> list = new List<string>();
list.Add("One");
list.Add("Two");
var result = query.Where(x => list.Contains(x.tags));
Je ne suis pas tout à fait sûr de votre question si x.tags est une chaîne ou une liste, s’il s’agit d’une liste Si je vous comprends bien, x.tags est une chaîne de chaînes. Si oui, la solution est la suivante:
list.Any(x => x.tags.IndexOf(x) > -1)
les compter faire
list.Count(x => x.tags.IndexOf(x) > -1)