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

本文关键字:表达式 LINQ 访问 属性 包含 | 更新日期: 2023-09-27 18:10:26

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

我看到在大多数情况下,这种事情是使用Expression上的静态方法完成的,但是Expression上没有Contains或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的值是否包含在age列表中。通常情况下,这类似于编写一个表达式来查看值列表是否包含我想要检查的值,但我不知道如何将表达式的结果输入作为要搜索的值。

为了澄清一点,我试图弄清楚如何采用一个具有所有person的查询,并仅获得person,其中未知表达式根据另一个表达式的值评估为真。在我的示例中,未知访问器表达式正在查看一个人的年龄,它需要能够评估它是否包含在另一个可接受的年龄列表中。

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

我不知道你为什么要用表达式。我看不出你从中得到了什么。但如果将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);
        }
    }
}

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