如何在Contains LINQ表达式中使用属性访问器LINQ表达式的值?

时间:2013-04-23 15:46:22

标签: c# linq linq-expressions

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

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

// 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。在我的示例中,未知访问器表达式正在查看人员的年龄,它需要能够评估它是否包含在另一个可接受年龄列表中。

2 个答案:

答案 0 :(得分:1)

我不确定你为什么要使用表达式。我不明白你从中获得了什么。但是,如果将AgeExpression的签名修改为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);
        }
    }
}

答案 1 :(得分:0)

这类问题也让我感到很烦恼。记住你可以访问LINQ / lambda表达式中的局部变量:所以一个简单的.where(x => x.value == AgeExpression)应该指向正确的方向