1

我有一个包含一堆记录的平面文件,假设它是 2 种记录类型的序列

--- 记录 1:ID;姓名;
姓氏 --- 记录 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);

在第一次映射之后,我得到了一个主题数组,在数组的每个元素中,字段 ID、SURNAME、NAME 都正确填充了值。AGE 和 SEX 按预期保留为 NULL。
但是在第二次映射之后,来自 R1 的所有字段(ID、NAME、SURNAME)都被初始化为 NULL,而我只从 R2 获取字段(AGE 和 SEX)。

如何获得字段的完整联合?
有人可以指出正确的方法吗?

4

1 回答 1

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();
于 2012-08-05T12:18:34.177 回答