2012-03-15 15 views
8

A continuación de una pregunta previous que pregunté, ahora estoy tratando de averiguar cómo crear expresiones dinámicas para AND Y & consultas OR.Cómo construir un árbol de expresiones dinámicas Y O linq en un bucle

Dada la siguiente matriz de cadenas:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"}; 

me gustaría expresar dinámicamente esto en una expresión LINQ - Algo a lo largo de las líneas de:

var v = from p in products 
     where 
     (p.Amount >= 0 && p.Amount <= 100) || 
     (p.Amount >= 101 && p.Amount <= 200) || 
     (p.Amount >= 500 && p.Amount <= 1000) 
     select p; 

¿Cómo puedo construir dinámicamente la expresión LINQ en este ciclo?

string[] ranges = new string[]{"0-100", "100-200", "500-1000"}; 

var query = products.AsQueryable(); 

foreach (var item in ranges) 
{ 
    int min = int.Parse(item.Split('-').First()); 
    int max = int.Parse(item.Split('-').Last());     
    //Linq expression? 
} 

Respuesta

16

Uso predicate builder:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"}; 
var predicate = PredicateBuilder.False<Product>(); 

foreach (var item in ranges) 
{ 
    int min = int.Parse(item.Split('-').First()); 
    int max = int.Parse(item.Split('-').Last());     
    predicate = predicate.Or(p => p.Amount >= min && p.Amount <= max); 
} 

Observe cómo empezamos con el estado booleano de false y or juntos predicados en el bucle. Por el contrario, puede comenzar con un estado de true y and junto con los predicados.

Por último, no estoy seguro si esto es posible con la sintaxis de consulta de comprensión, pero la consulta última puede entonces ser:

var v = products.Where(predicate); 
+0

Gracias esto me llevó a la pista derecha. Terminé instalando el paquete Nuget LINQKit con el creador de predicados incluido y más. Esto es útil si estás trabajando con objetos EF. – Fixer

Cuestiones relacionadas