如何在包含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,其中未知表达式根据另一个表达式的值评估为真。在我的示例中,未知访问器表达式正在查看一个人的年龄,它需要能够评估它是否包含在另一个可接受的年龄列表中。
我不知道你为什么要用表达式。我看不出你从中得到了什么。但如果将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)
应该为您指明正确的方向