2011-06-17 20 views
8

Hola quiero crear una lista basada en la cadena de búsqueda utilizando expresiones de predicado.Cómo crear un predicado de forma dinámica

Tengo una lista de tipo de productos que contiene diferentes nombres.

List<products> list1 = new List<products>(); 

     list1.Add(new products("sowmya")); 
     list1.Add(new products("Jane")); 
     list1.Add(new products("John")); 
     list1.Add(new products("kumar")); 
     list1.Add(new products("ramya")); 
     listBox1.ItemsSource = list1; 

ahora quiero filtrar el contenido en función del usuario input.User entrará n ninguna de las cadenas con '+' como separador. Después de recibir las cuerdas pasaré a predicado objeto como éste

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     List<products> list2 = new List<products>(); 
     Expression<Func<products, bool>> predicate = PredicateBuilder.True<products>(); 
     if (e.Key == Key.Enter) 
     { 
      string Searchstring = textBox1.Text.ToString().Trim(); 
      string[] separator = new string[] { "+" }; 
      string[] SearchItems=Searchstring.Split(separator,StringSplitOptions.None); 
      foreach (string str in SearchItems) 
      { 
       string temp = str; 
       predicate =p => p.Name.Contains(temp.ToLower());     
      } 

      list2 = list1.AsQueryable().Where(predicate).ToList(); 
      listBox1.ItemsSource = list2; 
     } 
    } 

si entro en más de una cadena (sowmya + Jane + john) su dando sólo la última cadena resultado (John), pero quiero una lista de todas las cadenas coincidentes

Responda esta pregunta porque estoy intentando esto pero no pude obtener el resultado.

Por favor, ayuda un poco gracias.

+0

dup: http://stackoverflow.com/questions/845059/how-do-i-dynamically-create-an-expressionfuncmyclass-bool-predicate –

Respuesta

12

inicializar el predicado como falso

Expression<Func<products, bool>> predicate = PredicateBuilder.False<products>(); 

Es necesario combinar los predicados usando Or

foreach (string str in SearchItems) 
{ 
    string temp = str; 
    predicate = predicate.Or(p => p.NameToLower().Contains(temp.ToLower()));     
} 
+0

Si uso And para combinar predicados, se dan todos los elementos de la lista pero no el resultado de la cadena coincidente – Sowmya

+0

@Sowmya actualizó mi respuesta. tienes que usar 'temp' no' str' dentro del predicado – Eranga

+0

Hola Eranga, muchas gracias, está funcionando bien. Realmente me ayudaste – Sowmya

1

Como no estoy seguro de que la instancia predicado tiene una y el método, le sugiero que utilice este código :

var list = list1.AsQueryable(); 
foreach (string str in SearchItems) 
{ 
    list = list.Where(p => p.Name.ToLower().Contains(str.ToLower())); 
} 
listBox1.ItemsSource = list.ToList(); 
+0

si uso este código, da solo un resultado de cadena, pero si ingreso dos cadenas, no da ningún resultado. Busque la solución. Lo necesito. – Sowmya

+0

que podría ser debido a la primera '.ToLower()' Acabo de agregar. si no es así, asegúrese de que su propiedad 'Name' realmente contiene las dos cadenas que busca –

+0

mismo problema nuevamente, dando el último resultado de la cadena solamente.Ya estoy seguro La propiedad" Name "contiene las dos cadenas – Sowmya

2

No tiene que crear un predicado aquí. Puede intentar algo como esto

List<products> list1 = new List<products>(); 

list1.Add(new products("sowmya")); 
list1.Add(new products("Jane")); 
list1.Add(new products("John")); 
list1.Add(new products("kumar")); 
list1.Add(new products("ramya")); 

string input = "aaa+kuma+ram"; 
List<string> searchStrings = 
    input.Split(new string[] { "+" }, StringSplitOptions.None) 
    .Select(s => s.ToLower()) 
    .ToList(); 

List<products> list2 = (
    from p in list1 
    where searchStrings.Any(s => p.Name.Contains(s)) 
    select p).ToList(); 

list2 contendrá "kumar" y "ramya".

+0

Gracias y esto funcionará y funciona, también lo sabía, pero necesito construirlo usando el predicado solo por favor ayúdenme – Sowmya

+0

@Sowmya, entonces deberían probar lo que sugiere Eranga. – Gebb

Cuestiones relacionadas