繁体   English   中英

使用valueinjecter将EF4变量对象映射到DTO

[英]EF4 var object mapping to DTO using valueinjecter

我有下面的一个linQ查询

 var records = (from P in Person
                join B in BankAccount
                on P.ID equals B.PersonID
                select new { P, B}).ToList();

人表有很多字段,但我只需要使用ID和Name。 同样,对于BankAccount,我只需要使用ID,AccountType和AccountBalance

然后,我使用类似的方法将上述记录var类型传递给另一个映射器类

    public List<CompositeDTO> MapToDto(IEnumerable<object> data)
    {
        foreach (var rec in data) 
        {
         dto.InjectFrom(rec );
         dtoList.Add(dto);
        }
        return dtoList;
    }

其中CompositeDTO如下

public class CompositeDTO 
{
  public int PersonID {get; set;}
  public String PersonName {get; set;}
  public int AccountID {get; set;}
  public String AccountType{get; set;}
  public int AccountBalance{get; set;}
}

问题是我无法使用dto.InjectFrom(rec )将任何值输入到CompositeDTO类型的对象中

应该怎么做? 此处的文档仅说明了如何对来自两个不同源类的一个字段执行此操作。 我错过了什么吗? 能做到吗?

正如我在此线程上阅读的AutoMapper vs ValueInjecter

您还可以使用ValueInjecter来映射匿名和动态对象

对于AFAIK,必须按照约定仅在不声明任何自定义映射的情况下完成此操作。 检查文档

target.InjectFrom(source)将从源中获取属性,并将它们注入到与它们NameType相匹配的目标中

所以在您的情况下,来源是匿名的

 {
   public Person P { get; set; }
   public BankAccount B { get; set; } 
 }

并且目标CompositeDTO没有名为Person或BankAccount的名为P或B的属性,因此没有匹配项


一个可行的例子:

 var source = new { PersonID = 7, PersonName = "Jon" }; var target = new CompositeDTO(); target.InjectFrom(source); 

我认为AutoMapper在这里做得更好。 我使用AutoMapper修改了地图方法,如下所示

public List<CompositeDTO> MapToDto(IEnumerable<object> data)
{
     dtoList = data.Select(Mapper.DynamicMap<CompositeDTO>).ToList();

    //foreach (var rec in data) 
    //{
    // dto.InjectFrom(rec );
    // dtoList.Add(dto);
    //}
    return dtoList;
}

我要做的就是将linQ查询中使用的别名添加到CompositeDTO的属性中,例如P_PersonIDB_AccountType

我认为ValueInjecter应该致力于添加此功能。 我真的很喜欢不必在使用地图之前就创建地图,就像当前在非动态类型中在AutoMapper中所做的那样。 我现在在代码中使用两个不同的对象映射器。 那不好吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM