2009-11-18 11 views
31

Desidero ottenere una raccolta di entità prodotto in cui la proprietà product.Description contiene una delle parole in un array di stringhe.LINQ: Il campo stringa entità contiene uno qualsiasi di una serie di stringhe

Sarebbe simile a questa (risultato sarebbe qualsiasi prodotto che aveva la parola "senape o 'sottaceti' o 'gusto' nella descrizione del testo):

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 

ho già guardato this similar question ma couldn 't farlo funzionare.

risposta

75

Dal momento che si vuole vedere se la ricerca contiene una parola che è contenuta nella descrizione di p è fondamentalmente necessario testare per ogni valore alla ricerca, se è contenuto nella descrizione di p

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

Questo è il C# sintassi per il metodo di lambda dato che il mio vb che non è grande

+1

Brillante! Ha funzionato. La sintassi VB è: search.Any (Funzione (n) p.Description.ToLower.Contains (n)) –

+0

Quando provo a farlo, ottengo "Impossibile creare un valore costante di tipo 'Tipo chiusura'. i tipi primitivi ('come Int32, String e Guid') sono supportati in questo contesto. " la mia "ricerca" è una lista e la mia "descrizione" è anche una stringa. –

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

Accidenti hai rubato la mia prima VB.NET risposta! ; p +1 in ogni caso – leppie

+0

@leppie: Sì, questa è una delle mie poche risposte VB.NET. – jason

4

è possibile utilizzare una semplice query LINQ, se tutto ciò che serve è quello di verificare la presenza di sottostringhe:

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

Se si desidera verificare la presenza di parole intere, si può usare un'espressione regolare:

  1. corrispondenza con un'espressione regolare che è la disgiunzione di tutte le parole:

    // 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. suddivisione della stringa in parole con un'espressione regolare, e test per l'adesione sulla raccolta parole (questo sarà più veloce se si utilizza fare le parole in un HashSet invece di un List):

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

per filtrare una raccolta di frasi secondo questo criterio tutto ciò che dovete fare il suo metterlo in una funzione e chiamare Where:

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

o metterlo in un lambda:

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

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

Problemi correlati