c# - AutoMapper:如何将2个不同来源的字段复制到1个目的地

时间:2012-08-04 16:32:53

标签: c# mapping automapper

我有一个包含大量记录的平面文件,让我们说它是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)获取字段。

如何获得字段的完整联合?
有人能指出我正确的做法吗?

1 个答案:

答案 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 InjecterInjectFrom() FTW!

var subjects = firstRecords
.Select((first, index) =>
    {
        var second = secondRecords[index];
        var r = new Subject();
        r.InjectFrom(first).InjectFrom(second);
        return r;
    })
.ToArray();