EF6:映射到ViewModel可重用性

Joh*_*ohn 4 c# linq entity-framework entity-framework-6

使用Entity Framework 6,我在类对象和包含在类中的viewmodel对象之间有映射函数,如下所示:

public class DataMappers
{
    public static Expression<Func<Data.Models.Employer, EmployerViewModel>> EmployerMapper = (e => new EmployerViewModel()
    {
        Name = e.Name,
        Location = e.Location
        ....
    });
}
Run Code Online (Sandbox Code Playgroud)

我可以在多个地方调用,如下所示:

            results = db.Employers.OrderBy(e => e.Name)
                                  .Select(DataMappers.EmployerMapper)
                                  .ToList();
Run Code Online (Sandbox Code Playgroud)

这将生成仅包含我需要的列的SQL语句.我的问题是,如果其他表引用我的'雇主'表,是否还有重用它?即

    public static Expression<Func<Data.Models.Person, PersonViewModel>> Person = (p => new PersonViewModel()
    {
        FirstName = p.FirstName,
        LastName = p.LastName,
        Employer = *use the 'EmployerMapper' expression above on p.Employer*
        ....
    });
Run Code Online (Sandbox Code Playgroud)

可以这样做,还是我需要在这种情况下复制映射代码?

我尝试使用它只是一个Func而不是Expression<Func>第二个例子,它将编译(Employer = EmployerMapper(p.Employer)),但是,你The LINQ expression node type 'Invoke' is not supported in LINQ to Entities在运行时收到异常.

hai*_*770 5

你必须安装LinqKit,并使用它AsExpandable():

using LinqKit;

results = db.Employers.AsExpandable()
                      .OrderBy(e => e.Name)
                      .Select(DataMappers.EmployerMapper)
                      .ToList();
Run Code Online (Sandbox Code Playgroud)

而你的投影功能:

using LinqKit;

public static Expression<Func<Data.Models.Person, PersonViewModel>> Person = (p => new PersonViewModel()
    {
    FirstName = p.FirstName,
    LastName = p.LastName,
    Employer = DataMappers.EmployerMapper.Invoke(p.Employer)
    });
Run Code Online (Sandbox Code Playgroud)

在LinqKit以及如何更多信息,它的工作原理在这里.