9

我在 Silverlight 中有一个组合框。它具有由我的一个 LINQ-to-SQL 对象(即名称、地址、年龄等)的属性构建的一组值。我想根据组合框中选择的值过滤我的结果。

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

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

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

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

4

3 回答 3

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的表达式树:

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);
于 2009-01-30T23:41:36.077 回答
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

于 2009-01-30T21:00:46.887 回答
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;
于 2009-02-12T01:46:40.843 回答