1

我有如下的 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 类型传递给另一个映射器类,方法如下

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

问题是我无法将任何值放入我的类型对象CompositeDTOdto.InjectFrom(rec )

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

4

3 回答 3

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);
于 2012-12-03T09:35:06.987 回答
0

正如我在这个线程AutoMapper vs ValueInjecter上读到的:

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

并且 AFAIK 必须在没有声明任何自定义映射的情况下完成,只是按照约定,必须可用。签出文档

于 2012-12-02T16:06:52.333 回答
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's 属性中P_PersonID,如下所示B_AccountType

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

于 2012-12-16T16:22:36.470 回答