基于Combobox值构建动态LINQ查询

时间:2009-01-30 20:29:42

标签: linq silverlight linq-to-sql dynamic-linq

我在Silverlight中有一个组合框。它有一个由我的一个LINQ-to-SQL对象(即Name,Address,Age等)的属性构建的值集合。我想根据组合框中选择的值过滤我的结果。

示例:假设我希望每个人都姓“史密斯”。我从下拉列表中选择“姓氏”,然后在文本框控件中输入smith。通常我会写一个类似于......

的LINQ查询
  

var query = from p in collection
其中p.LastName == textbox.Text
选择p;

是否可以动态决定属性,也许使用Reflection?像

这样的东西
  

var query = from p in collection
其中p。(DropDownValue)== textbox.Text
选择p;

3 个答案:

答案 0 :(得分:19)

假设:

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

IQueryable<Person> collection;

您的查询:

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

表示与:

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

编译器将其从扩展方法转换为:

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

Queryable.Where的第二个参数是Expression<Func<Person, bool>>。编译器理解Expression<>类型并生成代码以构建表示lambda的expression tree

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"));

这就是查询语法的含义。

您可以自己调用这些方法。要更改比较属性,请替换为:

typeof(Person).GetProperty("LastName")

使用:

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

答案 1 :(得分:1)

Scott Guthrie有一个关于动态构建LINQ to SQL查询的简短系列:

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

这是一种简单的方法......然后还有另一种方式涉及更多:

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

答案 2 :(得分:0)

您还可以使用我创建的库:http://tomasp.net/blog/dynamic-linq-queries.aspx。您可以将属性存储在ComboBox中作为lambda表达式,然后只写:

var f = (Expression<Func<Product, string>>)comboBox.SelectedValue;
var query =
    from p in collection
    where f.Expand(textBox.Text)
    select p;