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

C# 如何在包含LINQ表达式中使用属性访问器LINQ表达式中的值?,c#,linq,linq-expressions,C#,Linq,Linq Expressions,我目前有一个用于访问对象属性的属性访问器的LINQ表达式。我现在需要构建一个LINQ表达式来计算谓词,以查看属性访问器的结果是否包含在列表中 我已经看到,在大多数情况下,这种事情是使用表达式上的静态方法来完成的,但是没有包含或in作为表达式上的静态方法可用,因此我不确定如何继续 // A data object internal class PersonDAL { public int Age ( get; set; } } // A business object public cl

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

我已经看到,在大多数情况下,这种事情是使用表达式上的静态方法来完成的,但是没有包含或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);
        }
    }
}
//数据对象
内阶级个人
{
公共整数(get;set;}
}
//业务对象
公共阶层人士
{
私有个人根{get;set;}
公共静态表达式
{
得到
{
返回(root)=>(root.Age);
}
}
}
现在我希望能够检查AgeExpression的值是否包含在一个Age列表中。通常这类似于编写一个表达式来查看值列表是否包含我要检查的值,但我不知道如何将表达式的结果作为要搜索的值输入


为了澄清一点,我试图找出如何获取一个包含所有Persons的queryable,并仅获取Persons,其中一个未知表达式根据另一个表达式的值计算为true。在我的示例中,未知访问器表达式查看的是一个人的年龄,它需要能够计算是否包含在另一个可接受年龄的列表中。

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

我不确定您为什么使用表达式。我不知道您从中获得了什么。但是如果您将
AgeExpression
的签名修改为
Expression
,您可以编译并执行它:

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);
        }
    }
}
void Main()
{
var pDal=新员工{Age=3};
var ageFunc=Person.AgeExpression.Compile();
变量年龄=年龄函数(pDal);
//年龄是3岁
}
//在此处定义其他方法和类
//数据对象
公营人员
{
公共整数{get;set;}
}
//业务对象
公共阶层人士
{
公众人士(个人顾问)
{
this.dal=dal;
}
私有个人dal{get;set;}
公共静态表达式
{
得到
{
返回(root)=>(root.Age);
}
}
}

LINQ到实体?LINQ到对象?LINQ到XML?@dtb-目前,基础DAL是Codesmith PLINQO模板的旧版本。我已经在BOL对象中手动构建了属性访问器,该访问器指向PLINQO生成的DAL对象。如果没有动态表达式,您将如何进行查询?AGEXPRESSION是静态的,不会ork。它需要访问实例变量。它应该是非静态的,还是我缺少了什么?@Shlomo-这是一个访问器表达式。它是一个函数,由PersonDal的特定实例提供,并对该实例的属性进行求值。根本原因是试图构建一个与LINQ兼容的筛选器框架。所有这些在运行时,我们会知道定义如何解析某个特定值的表达式,然后我必须在过滤器中使用该值。编译和执行可能仍然是我需要的,所以我会尝试一下,看看我能从哪里得到它。哦,还有,我实际上已经有了Func,我只是在trans时错过了它将其设置为一个示例。我不确定的是,当在另一个表达式中访问该值时,我将传入什么值传递给它。要给出一个更完整的示例,请假设我正在选择一个人员列表,其中他们的年龄在10、20和30的列表中。我可以将年龄添加到列表中,然后执行AgeList.Contains(AgeAccessorFunc(??)但是我需要一些方法来将我选择的Person连接到Contains和accessor。我假设AgeList是IQueryable的某种形式?那么查询会像这样:Persons.Where(p=>AgeList.Contains(p.Age))是的,类似的。我认为它实际上是以p为参数的年龄函数。非常确定这对具体的例子有效,但我不确定的是,如果有其他标准,我如何组合。我认为这可能会延伸到另一个问题。