Building Dynamic LINQ Queries based on Combobox Value

青春壹個敷衍的年華 提交于 2019-11-27 12:56:31

Assuming:

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(
    collection,
    Expression.Lambda<Func<Person, bool>>(
        Expression.Equal(
            Expression.MakeMemberAccess(
                Expression.Parameter(typeof(Person), "p"),
                typeof(Person).GetProperty("LastName")),
            Expression.MakeMemberAccess(
                Expression.Constant(textBox),
                typeof(TextBox).GetProperty("Text"))),
        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:

typeof(Person).GetProperty("LastName")

with:

typeof(Person).GetProperty(dropDown.SelectedValue);

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

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

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

http://www.albahari.com/nutshell/predicatebuilder.aspx

You can also use the library I created: http://tomasp.net/blog/dynamic-linq-queries.aspx. You would store the properties in ComboBox as lambda expressions and then just write:

var f = (Expression<Func<Product, string>>)comboBox.SelectedValue;
var query =
    from p in collection
    where f.Expand(textBox.Text)
    select p;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!