13

Following on from a previous question i asked, I'm now trying to figure out how to build dynamic expressions for both AND & OR queries.

Given the following string array:

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

I would like to dynamically express this in a linq expression - Something along the lines of:

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;

How do i dynamically build the linq expression in this loop?

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?
}
Community
  • 1
  • 1
Fixer
  • 5,985
  • 8
  • 40
  • 58

1 Answers1

20

Use 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);
}

Notice how we start with the boolean state of false, and or together predicates in the loop. Conversely, you can start with a state of true and and together the predicates.

Finally, not sure if this is possible with query comprehension syntax, but your ultimate query can then look like:

var v = products.Where(predicate);
Kirk Woll
  • 76,112
  • 22
  • 180
  • 195
  • Thanks this led me onto the right track. I ended up installing the nuget package LINQKit with includes predicate builder and more. This is useful if you're working with EF objects. – Fixer Mar 16 '12 at 03:30