我目前有一个用于访问对象属性的属性访问器的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。在我的示例中,未知访问器表达式正在查看人员的年龄,它需要能够评估它是否包含在另一个可接受年龄列表中。
答案 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)
应该指向正确的方向