我有像下面那样的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仅解释了如何从两个不同的源类中为一个字段执行此操作。我错过了什么吗?可以这样做吗?
答案 0 :(得分:0)
当我读到这个帖子AutoMapper vs ValueInjecter时:
您还可以使用ValueInjecter从匿名和动态映射 对象
AFAIK必须在没有声明任何必须可用的约定的自定义映射的情况下完成。结帐documentation。
答案 1 :(得分:0)
target.InjectFrom(source)
将从源获取属性并将其注入到Name
和Type
所以在你的情况下,来源是匿名的
{
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_PersonID
和B_AccountType
我认为ValueInjecter应该可以添加此功能。我真的不喜欢在使用它之前不必创建地图,就像在AutoMapper中当前为非动态类型完成它一样。我现在在我的代码中使用两个不同的对象映射器。那不好吗?