2012-07-19 18 views
7

He intentado resolver este problema todo el día y no he encontrado una solución que realmente funcione. Cuando busco algunos datos, quiero filtrar los datos en función de varias palabras.Consulta LINQ para hacer coincidir varias palabras

Mi valor de entrada se divide utilizando la función .Split estándar.

string[] searchstrings = MessageResult.Split(' '); 

he hecho una consulta (que obviamente no funciona correctamente) que trata de filtrar todas las entradas que coinciden con cada cadena en searchstrings.

    var suggestions = (from a in query 
           from w in searchstrings 
           where a.Message.ToLower().Contains(w.ToLower()) 
           select a).Distinct(); 

consulta es mi variable que tiene todos los datos. ¿Cómo puedo hacer que esta consulta realmente solo concuerde con las entradas que incluyen cada cadena en cadenas de búsqueda?

+0

Para aclarar, desea las cadenas de consulta que contienen cada cadena dividida, es decir, ** cada ** cadena en searchString debe estar en las cadenas resultantes. – Breland

+0

si la pregunta de @Breland es verdadera, ¿funcionaría eso? Contiene .All Me gustaría ver la consulta generada por esa expresión – jjchiw

+0

¿cuál debería ser su resultado final? – Yasser

Respuesta

17

Creo que el siguiente código debería resolver su problema. Comprueba si todas las palabras en searchstring están en una consulta (a).

var suggestions = (from a in query 
        where searchstrings.All(word => a.ToLower().Contains(word.ToLower())) 
        select a); 
+0

Esto funcionó muy bien, ¡gracias! – Alexander

16
var query = new string[] 
{ 
    "abc foo bar xyz john doe", 
    "abc foo bar xyz doe", 
    "hello world", 
    "abc foo bar john doe", 
}; 

var searchstrings = new string[] 
{ 
    "abc", 
    "foo", 
    "john", 
    "xyz", 
}; 

searchstrings = searchstrings.Select(x => x.ToLower()).ToArray(); 

var results = query.Select(x => x.ToLower()) 
        .Where(x => searchstrings.All(y => x.Contains(y))); 

Nota:
ToLower() se lleva a cabo fuera de la cláusula Where, para guardar un montón de llamadas a ese método.

+3

+1 para refactorizar la llamada '.ToLower' ... –

Cuestiones relacionadas