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

时间:2015-09-25 14:13:45

标签: c# entity-framework linq-to-entities linq-expressions

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

我最近将一些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。

2 个答案:

答案 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方法。
相关问题