我有一个包含大量记录的平面文件,让我们说它是2种记录类型的序列
--- Record1:ID; NAME; SURNAME
---记录2:年龄;性别;
让我们调用R1代表Record1和R2代表Record2的类 在这一刻,我有一个R1阵列和另一个R2阵列 如果我有一个名为Subject的POCO有5个字段,完全命名为R1和R2字段的并集,我如何配置AutoMapper为我做魔术?
现在我尝试这个:
var subjects = Mapper.Map<IEnumerable<R1>, List<Subject>>(arrayOfR1s);
Mapper.Map<IEnumerable<R2>, List<Subject>>(arrayOfR2s, subjects);
在第一次映射之后,我得到一个Subjects数组,在数组的每个元素中,字段ID,SURNAME,NAME都正确地填充了值。 AGE和SEX按预期保留为NULL 但是在第二次映射之后,R1(ID,NAME,SURNAME)中的所有字段都被初始化为NULL,而我只从R2(AGE和SEX)获取字段。
如何获得字段的完整联合?
有人能指出我正确的做法吗?
答案 0 :(得分:0)
加入(匿名输入)对象的直接动态映射怎么样?
Record1[] firstRecords = new[]
{
new Record1
{
ID = Guid.NewGuid(),
Name = "John", Surname = "Doe"
},
new Record1
{
ID = Guid.NewGuid(),
Name = "Jane", Surname = "Roe"
}
};
Record2[] secondRecords = new[]
{
new Record2 { Age = 20, Sex = Sex.Male },
new Record2 { Age = 20, Sex = Sex.Female }
};
var subjects = firstRecords
.Select((first, index) =>
{
var second = secondRecords[index];
var r = new
{
ID = first.ID,
Name = first.Name,
Surname = first.Surname,
Age = second.Age,
Sex = second.Sex
};
return Mapper.DynamicMap<Subject>(r);
})
.ToArray();
顺便说一下,您可以在不使用AutoMapper的情况下映射这些对象,但使用LINQ Select()
。
var subjects = firstRecords
.Select((first, index) =>
{
var second = secondRecords[index];
var r = new Subject
{
ID = first.ID,
Name = first.Name,
Surname = first.Surname,
Age = second.Age,
Sex = second.Sex
};
return r;
})
.ToArray();
如果您需要复制很多属性,请查看Value Injecter。 InjectFrom()
FTW!
var subjects = firstRecords
.Select((first, index) =>
{
var second = secondRecords[index];
var r = new Subject();
r.InjectFrom(first).InjectFrom(second);
return r;
})
.ToArray();