2009-11-18 8 views
31

Je souhaite obtenir une collection d'entités Product où la propriété product.Description contient l'un des mots d'un tableau de chaînes.LINQ: champ de chaîne Entity contient un tableau de chaînes

Il ressemblerait à quelque chose comme ça (résultat serait tout produit qui avait le mot « moutarde ou « cornichons » ou « délectation » dans le texte Description):

Dim products As List(Of ProductEntity) = New ProductRepository().AllProducts 

Dim search As String() = {"mustard", "pickles", "relish"} 

Dim result = From p In products _ 
    Where p.Description.Contains(search) _ 
    Select p 

Return result.ToList 

je l'ai déjà regardé this similar question mais couldn « t obtenir pour fonctionner.

Répondre

75

Puisque vous voulez voir si la recherche contient un mot qui est contenu dans la description de p dont vous avez besoin essentiellement de tester pour chaque valeur à la recherche si elle est contenue dans la description p

result = from p in products 
      where search.Any(val => p.Description.Contains(val)) 
      select p; 

C'est c syntaxe # pour la méthode lambda puisque mon vb est pas terrible

+1

Brillant! Ça a marché. La syntaxe VB est: search.Any (Fonction (n) p.Description.ToLower.Contains (n)) –

+0

Lorsque j'essaie de faire cela, je reçois "Impossible de créer une valeur constante du type 'Type de fermeture'. Les types primitifs ('tels que Int32, String et Guid') sont pris en charge dans ce contexte. " ma "recherche" est une liste et ma "description" est aussi une chaîne. –

6
Dim result = From p in products _ 
      Where search.Any(Function(s) p.Description.Contains(s)) 
      Select p 
+0

Putain vous avez volé ma première réponse VB.NET! ; p +1 de toute façon – leppie

+0

@leppie: Oui, c'est l'une de mes rares réponses VB.NET. – jason

4

Vous pouvez utiliser une simple requête LINQ, si vous avez besoin est de vérifier les sous-chaînes:

var q = words.Any(w => myText.Contains(w)); 
// returns true if myText == "This password1 is weak"; 

Si vous voulez vérifier les mots entiers, vous pouvez utiliser une expression régulière:

  1. Correspondance de une expression régulière qui est la disjonction de tous les mots:

    // you may need to call ToArray if you're not on .NET 4 
    var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b"); 
    // the following line builds a regex similar to: (word1)|(word2)|(word3) 
    var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")"); 
    var q = pattern.IsMatch(myText); 
    
  2. divise la chaîne en mots avec une expression régulière, et les tests d'adhésion sur la collecte de mots (cela obtenir plus rapidement si vous utilisez faire des mots dans un HashSet au lieu d'un List):

    var pattern = new Regex(@"\W"); 
    var q = pattern.Split(myText).Any(w => words.Contains(w)); 
    

afin de filtrer une collection de phrases selon ce critère tout ce que vous avez à faire son mettre en fonction et appelez Where:

// Given: 
// bool HasThoseWords(string sentence) { blah } 
var q = sentences.Where(HasThoseWords); 

Ou le mettre dans un lambda:

var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w))); 

Ans De =>How to check if any word in my List<string> contains in text par @R. Martinho Fernandes

Questions connexes