如何在另一个Expression中的单个对象上重用Expression

我觉得我错过了一些简单的东西,但是我没有找到回答我问题的文档。

我最近将一些linq投影分解为可重用的表达式。 它在集合上运行时效果很好,但我似乎无法弄清楚如何将表达式应用于另一个表达式中的单个对象。 以下是我要完成的一个示例:

public class Person { public string ID { get; set; } public string Name { get; set; } } public class PersonDto { public string ID { get; set; } public string Name { get; set; } } public class Department { Person Manager { get; set; } List Employees { get; set; } } public class DepartmentDto { PersonDto Manager { get; set; } List Employees { get; set; } } public Expression<Func> CreatePersonDto = p => new PersonDto { ID = p.ID, Name = p.Name }; public Expression<Func> CreateDepartmentDto = d => new DepartmentDto { Manager = d.Manager // How do I transform this `Person` using `CreatePersonDto` Employees = d.Employees.Select(CreatePersonDto) //Does not work either }; 

编辑:要清楚,我正在使用需要使用此Expression生成SQL语句的Linq-to-Entities。 因此,我无法将表达式CompileFunc因为我可以使用Linq-to-Objects。

您可以使用LINQKit扩展其他表达式中的表达式:

 private static Expression> CreateDepartmentDtoUnexpanded = d => new DepartmentDto { Manager = CreatePersonDto.Invoke(d.Manager), Employees = d.Employees.Select(employee => CreatePersonDto.Invoke(employee)) .ToList(), }; public static Expression> CreateDepartmentDto = CreateDepartmentDtoUnexpanded.Expand(); 

您可以:

 public static Expression> CreateDepartmentDto = d => new DepartmentDto { Manager = CreatePersonDto.Compile()(d.Manager), Employees = d.Employees.Select(CreatePersonDto.Compile()).ToList() // Or declare Employees as IEnumerable and avoid ToList conversion }; 

显然,您可以存储已编译的Func ,而不是调用两次Compile方法