从现有表达式在父对象上创建表达式树以进行c#mongodb驱动程序分析

从现有表达式在父对象上创建表达式树以进行c#mongodb驱动程序分析,c#,expression,expression-trees,mongodb-.net-driver,expressionvisitor,C#,Expression,Expression Trees,Mongodb .net Driver,Expressionvisitor,我有一门课是这样的: public class Person { public string Name { get; set; } public string Email { get; set; } // ... } Expression<Func<Person, bool>> expression = p => p.Name == "MyName" && p.Email = "example@test.com" pu

我有一门课是这样的:

public class Person
{
    public string Name { get; set; }

    public string Email { get; set; }

    // ...
}
Expression<Func<Person, bool>> expression = p => p.Name == "MyName" && p.Email = "example@test.com"
public static Expression<Func<MyParentObject<T>, bool>> GetParentExpression(Expression<Func<T, bool>> expression)
{
    Expression <Func<MyParentObject<T>, bool>> result = // process...
    // ...
    return result;
}
我还有一个通用类,比如:

public class MyParentObject<T>
{

    public T Item { get; set; }

    // ...
}
公共类MyParentObject
{
公共T项{get;set;}
// ...
}
例如,我有这样一个表达式:

public class Person
{
    public string Name { get; set; }

    public string Email { get; set; }

    // ...
}
Expression<Func<Person, bool>> expression = p => p.Name == "MyName" && p.Email = "example@test.com"
public static Expression<Func<MyParentObject<T>, bool>> GetParentExpression(Expression<Func<T, bool>> expression)
{
    Expression <Func<MyParentObject<T>, bool>> result = // process...
    // ...
    return result;
}
Expression=p=>p.Name==“MyName”&&p.Email=”example@test.com"
如何将此表达式转换为:

Expression<Func<MyParentObject<Person>, bool>> expression = p => p.Item.Name == "MyName" && p.Item.Email = "example@test.com"
Expression=p=>p.Item.Name==“MyName”&&p.Item.Email=”example@test.com"
编辑:

我认为我的问题还不够深入,我想要一个这样的方法:

public class Person
{
    public string Name { get; set; }

    public string Email { get; set; }

    // ...
}
Expression<Func<Person, bool>> expression = p => p.Name == "MyName" && p.Email = "example@test.com"
public static Expression<Func<MyParentObject<T>, bool>> GetParentExpression(Expression<Func<T, bool>> expression)
{
    Expression <Func<MyParentObject<T>, bool>> result = // process...
    // ...
    return result;
}
公共静态表达式GetParentExpression(表达式)
{
表达式结果=//进程。。。
// ...
返回结果;
}
编辑:

我必须创建一个新的树表达式,然后由c#mongodb驱动程序解析。我不能在表达式树上调用其他编译方法

我想我必须使用,但我不知道如何…

你可以这样使用

public static Expression<Func<MyParentObject<T>, bool>> GetParentExpression<T>(Expression<Func<T, bool>> expression)
{
    Expression<Func<MyParentObject<T>, T>> item = parent => parent.Item;
    var result = Expression.Lambda<Func<MyParentObject<T>, bool>>(
        Expression.Invoke(expression, item.Body), item.Parameters);
    return result;
}
public static Expression<Func<MyParentObject<T>, bool>> GetParentExpression<T>(Expression<Func<T, bool>> expression)
{
    Expression<Func<MyParentObject<T>, T>> item = parent => parent.Item;
    var body = new ParameterExpressionReplacer { source = expression.Parameters[0], target = item.Body }.Visit(expression.Body);
    var result = Expression.Lambda<Func<MyParentObject<T>, bool>>(body, item.Parameters);
    return result;
}

class ParameterExpressionReplacer : ExpressionVisitor
{
    public ParameterExpression source;
    public Expression target;
    protected override Expression VisitParameter(ParameterExpression node)
    {
        return node == source ? target : base.VisitParameter(node);
    }
}

我相信表达式转换是正确的,您在p.Item.Email=”中有一个错误example@test.com“,它应该是p.Item.Email=”example@test.com",我想我不能使用Expression.Invoke,因为c#mongodb驱动程序会使用我的表达式来解析表达式树,然后在mongo查询中转换它。然后你必须更改问题。我的答案完全覆盖了它现在的样子。根据你的编辑更新了答案。希望能有帮助。是的!非常感谢你