C# 如何在表达式树c中获取对新构造实例的引用#

C# 如何在表达式树c中获取对新构造实例的引用#,c#,lambda,expression-trees,projection,C#,Lambda,Expression Trees,Projection,是否可以在以下表达式树中获取对PositionViewModel的引用: public static Expression<Func<Model, ViewModel>> ToViewModel { get { return x => new PositionViewModel { Id = x.Id, Na

是否可以在以下表达式树中获取对
PositionViewModel
的引用:

    public static Expression<Func<Model, ViewModel>> ToViewModel
    {
        get
        {
            return x => new PositionViewModel
            {
                Id = x.Id,
                Name = x.Name,
                Employees = x.Employees.Select(e => new Employee
                {
                    Id = e.Id,
                    Name = e.Name,
                    Position = ??? // reference to PositionViewModel
                }).ToList()
            };
        }
    }
publicstaticexpressiontoviewmodel
{
得到
{
返回x=>newpositionviewmodel
{
Id=x.Id,
Name=x.Name,
Employees=x.Employees.选择(e=>newemployees
{
Id=e.Id,
Name=e.Name,
位置=???//对位置视图模型的引用
})托利斯先生()
};
}
}
我想是的,因为EF就是这么做的。 有什么建议吗

编辑:
忘了提到“position”是ViewModel类型。

我会自发地分步骤进行:

public static Expression<Func<Model, ViewModel>> ToViewModel
{
    get
    {
        return x => GetViewModel(x);
    }
}

public ViewModel GetViewModel(Model x)
{
    var vm = new PositionViewModel
    {
        Id = x.Id,
        Name = x.Name
    };

    vm.Employees = x.Employees.Select(p => new Employee
    {
        Id = p.Id,
        Name = p.Name,
        Position = vm
    }).ToList();

    return vm;
}
publicstaticexpressiontoviewmodel
{
得到
{
返回x=>GetViewModel(x);
}
}
公共视图模型GetViewModel(模型x)
{
var vm=新位置视图模型
{
Id=x.Id,
Name=x.Name
};
vm.Employees=x.Employees.Select(p=>newemployeen
{
Id=p.Id,
名称=p.名称,
位置=虚拟机
}).ToList();
返回虚拟机;
}

通过这种方式,您仍然可以将其包装为表达式树。

您可以使用
Employees
是一个属性的事实,这样您就可以向其setter添加任何代码。比如:

private IList<Employee> employees;

public IList<Employee> Employees
{
    get
    {
        return employees;
    }

    set
    {
        employees = value;

        foreach (var employee in employees)
        {
            employee.Position = this;
        }
    }
}
私人IList员工;
公务员
{
得到
{
返回员工;
}
设置
{
员工=价值;
foreach(员工中的var员工)
{
employee.Position=this;
}
}
}

有了它,您不需要在表达式中执行任何操作,
Position
将自动设置。

我认为您不能在初始化器语法中执行此操作。如果
Position==this
,那么是否可以在构造函数中初始化它?但这是一个
Employee
对象,为什么要引用
PositionViewModel
?我很困惑。我冒昧地编辑了一下这个问题,以消除困惑<代码>此引用当前正在执行代码的类型的当前实例。问题中的代码位于静态方法中(因此,没有当前实例),代码希望引用另一种类型。EF什么时候这样做?你就不能看看它是怎么做到的吗?这是我的第一个难题,但这不能再是一个表达式了。带有语句体的lambda表达式不能转换为表达式树。@FredrikMörk谢谢。问题是,如果这不是lambda表达式,它将导致n+1综合征。@user3049133请参阅更新的答案:通过将主体提取到单独的方法中,您仍然可以保留表达式树。谢谢,您的答案更符合我的意图。我希望我有机会标出两个正确答案,或者至少给你一个加分。