假设我在EF模型中有两个项目,可以投影到以下DTO中:
public class AddressDto
{
public int Id { get; set; }
public string Address { get; set; }
public static Expression<Func<Address, AddressDto>> Address2AddressDto()
{
return x => new AddressDto() {
Id = x.Id,
FullName = x.AddressLine
};
}
}
public class ClientDto
{
public int Id { get; set; }
public int FullName { get; set; }
public AddressDto Address { get; set; }
}
我该如何创建一个投影,以重用来自
AddressDto
的投影,将嵌套在 Client
中的 Address
转换为 ClientDto
?基本上我想要这样的东西:public static Expression<Func<Client, ClientDto>> Client2ClientDto()
{
return x => new ClientDto() {
Id = x.Id,
FullName = x.FullName,
Address
= <Apply projection AddressDto.Address2AddressDto to object x.Address>
};
}
我知道我可以做以下操作:
public static Expression<Func<Client, ClientDto>> Client2ClientDto()
{
return x => new ClientDto() {
Id = x.Id,
FullName = x.FullName,
Address = new AddressDto() {
Id = x.Id,
FullName = x.AddressLine
}
};
}
但是我希望能够在一个地方管理AddressDto
投影,而不是每个使用该投影的地方都要进行管理(实际对象更为复杂,代码重复将会在长期运行中引发问题)。
在我的调用代码中,我想要做以下操作:
dbRepo.Clients.Select(Client2ClientDto())
我所有当前的尝试都以异常结束:
LINQ表达式节点类型“Invoke”在LINQ to Entities中不受支持。