Using Combobox Values to Create Dynamic LINQ Queries

dynamic-linq linq linq-to-sql silverlight


I have a combo box in Silverlight. It has a collection of values built out of the properties of one of my LINQ-to-SQL objects (ie Name, Address, Age, etc...). I would like to filter my results based off the value selected in a combo box.

Example: Say I want everyone with a last name "Smith". I'd select 'Last Name' from the drop down list and enter smith into a textbox control. Normally I would write a LINQ query similar to...

var query = from p in collection
where p.LastName == textbox.Text
select p;

Is it possible to decide the property dynamically, maybe using Reflection? Something like

var query = from p in collection
where p.(DropDownValue) == textbox.Text
select p;

10/5/2009 5:13:40 AM

Accepted Answer


public class Person
    public string LastName { get; set; }

IQueryable<Person> collection;

your query:

var query =
    from p in collection
    where p.LastName == textBox.Text
    select p;

means the same as:

var query = collection.Where(p => p.LastName == textBox.Text);

which the compiler translates from an extension method to:

var query = Queryable.Where(collection, p => p.LastName == textBox.Text);

The second parameter of Queryable.Where is an Expression<Func<Person, bool>>. The compiler understands the Expression<> type and generates code to build an expression tree representing the lambda:

using System.Linq.Expressions;

var query = Queryable.Where(
    Expression.Lambda<Func<Person, bool>>(
                Expression.Parameter(typeof(Person), "p"),
        Expression.Parameter(typeof(Person), "p"));

That is what the query syntax means.

You are free to call these methods yourself. To change the compared property, replace this:



1/31/2009 4:58:54 AM

Popular Answer

Scott Guthrie has a short series on dyamically built LINQ to SQL queries:

That's the easy way...then there's another way that's a bit more involved:

Related Questions

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow