使用valueinjecter将EF4 var对象映射到DTO

时间:2012-12-02 15:54:29

标签: c# entity-framework-4 automapper valueinjecter

我有像下面那样的linQ查询

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

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

然后我将上面的记录var类型传递给另一个mapper类,使用类似的方法

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

问题是我无法使用CompositeDTO

将任何值输入到dto.InjectFrom(rec )类型的对象中

应该怎么做?文档here仅解释了如何从两个不同的源类中为一个字段执行此操作。我错过了什么吗?可以这样做吗?

3 个答案:

答案 0 :(得分:0)

当我读到这个帖子AutoMapper vs ValueInjecter时:

  

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

AFAIK必须在没有声明任何必须可用的约定的自定义映射的情况下完成。结帐documentation

答案 1 :(得分:0)

target.InjectFrom(source)将从源获取属性并将其注入到NameType

匹配的目标中

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

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

目标CompositeDTO没有名为P或B的属性,类型为Person和BankAccount,因此没有匹配

<小时/> 一个可行的例子:

var source = new { PersonID = 7, PersonName = "Jon" };

var target = new CompositeDTO();

target.InjectFrom(source);

答案 2 :(得分:0)

我认为AutoMapper在这方面做得更好。我使用AutoMapper修改了map方法,如下所示,它可以工作

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中当前为非动态类型完成它一样。我现在在我的代码中使用两个不同的对象映射器。那不好吗?