【问题标题】:EF6: Mapping to ViewModel ReusabilityEF6:映射到 ViewModel 可重用性
【发布时间】:2014-06-12 20:20:48
【问题描述】:

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

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

然后我可以像这样在多个地方调用:

            results = db.Employers.OrderBy(e => e.Name)
                                  .Select(DataMappers.EmployerMapper)
                                  .ToList();

这将生成一条仅包含我需要的列的 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*
        ....
    });

可以做到吗,或者我需要在这种情况下复制映射代码吗?

在第二个示例中,我尝试将它用作 Func 而不是 Expression&lt;Func&gt;,这将编译 (Employer = EmployerMapper(p.Employer)),但是,您会在运行时收到 The LINQ expression node type 'Invoke' is not supported in LINQ to Entities 异常。

【问题讨论】:

    标签: c# linq entity-framework entity-framework-6


    【解决方案1】:

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

    using LinqKit;
    
    results = db.Employers.AsExpandable()
                          .OrderBy(e => e.Name)
                          .Select(DataMappers.EmployerMapper)
                          .ToList();
    

    还有你的投影功能:

    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)
        });
    

    有关 LinqKit 及其工作原理的更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多