我觉得我错过了一些简单的东西,但我没有找到能回答我问题的文档。
我最近将一些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<Person> Employees { get; set; }
}
public class DepartmentDto
{
PersonDto Manager { get; set; }
List<PersonDto> Employees { get; set; }
}
public Expression<Func<Person, PersonDto>> CreatePersonDto = p => new PersonDto
{
ID = p.ID,
Name = p.Name
};
public Expression<Func<Department, DepartmentDto>> 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。因此,我无法Compile
表达式为Func
,因为我可以使用Linq-to-Objects。
答案 0 :(得分:2)
您可以使用LINQKit扩展其他表达式中的表达式:
private static Expression<Func<Department, DepartmentDto>> CreateDepartmentDtoUnexpanded = d => new DepartmentDto
{
Manager = CreatePersonDto.Invoke(d.Manager),
Employees = d.Employees.Select(employee => CreatePersonDto.Invoke(employee))
.ToList(),
};
public static Expression<Func<Department, DepartmentDto>> CreateDepartmentDto = CreateDepartmentDtoUnexpanded.Expand();
答案 1 :(得分:-1)
你可以:
public static Expression<Func<Department, DepartmentDto>> 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
};
显然,您可以存储已编译的Compile
Func
方法。