0

我目前有一个用于访问对象属性的属性访问器的 LINQ 表达式。我现在需要构建一个 LINQ 表达式,该表达式将评估谓词以查看属性访问器的结果是否包含在列表中。

我已经看到,在大多数情况下,这种事情是使用 Expression 上的静态方法完成的,但是没有 Contains 或 In 可用作 Expression 上的静态方法,所以我不确定如何继续。

// A data object
internal class PersonDAL
{
    public int Age ( get; set; }
}

// A business object
public class Person
{
    private PersonDAL root { get; set; }

    public static Expression<Func<PersonDAL, int>> AgeExpression
    {
        get
        {
            return (root) => (root.Age);
        }
    }
}

现在我希望能够检查 AgeExpression 的值是否包含在年龄列表中。通常这就像编写一个表达式来查看值列表是否包含我要检查的值,但我看不到如何将表达式的结果作为要搜索的值输入。

为了澄清一点,我试图弄清楚如何获取具有所有 Persons 的可查询对象,并仅获取未知表达式基于另一个表达式的值评估为 true 的 Persons。在我的示例案例中,未知访问器表达式正在查看一个人的年龄,它需要能够评估它是否包含在另一个可接受的年龄列表中。

4

2 回答 2

1

我不确定你为什么要使用表达式。我看不出你从他们那里得到了什么。但是如果修改了AgeExpressionto be的签名,就Expression<Func<PersonDAL, int>>可以编译执行:

void Main()
{
    var pDal = new PersonDAL { Age = 3 };

    var ageFunc = Person.AgeExpression.Compile();
    var age = ageFunc(pDal);
    // age is 3
}

// Define other methods and classes here

// A data object
public class PersonDAL
{
    public int Age { get; set; }
}

// A business object
public class Person
{
    public Person(PersonDAL dal)
    {
        this.dal = dal;
    }

    private PersonDAL dal { get; set; }

    public static Expression<Func<PersonDAL, int>> AgeExpression
    {
        get
        {
            return (root) => (root.Age);
        }
    }
}
于 2013-04-23T16:03:16.557 回答
0

这种问题也困扰了我很多..请记住,您可以在 LINQ/lambda 表达式中访问局部变量:所以一个简单的.where(x => x.value == AgeExpression)应该指向正确的方向

于 2013-04-23T15:52:49.850 回答