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

时间:2014-01-15 11:02:45

标签: c# lambda expression-trees projection

是否可以在以下表达式树中获取对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()
            };
        }
    }

我认为是,因为EF会这样做。 有什么建议吗?

编辑: 忘记提到“Postition”是ViewModel类型。

2 个答案:

答案 0 :(得分:2)

我会自发地分步进行:

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;
}

这样你仍然可以将它作为表达式树包装起来。

答案 1 :(得分:1)

您可以做的是使用Employees属性的事实,因此您可以将任何代码添加到其setter中。类似的东西:

private IList<Employee> employees;

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

    set
    {
        employees = value;

        foreach (var employee in employees)
        {
            employee.Position = this;
        }
    }
}

这样,您无需在表达式中执行任何操作,Position将自动设置。