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请参阅更新的答案:通过将主体提取到单独的方法中,您仍然可以保留表达式树。谢谢,您的答案更符合我的意图。我希望我有机会标出两个正确答案,或者至少给你一个加分。