1

たくさんのレコードを含むフラットファイルがあります。たとえば、2つのレコードタイプのシーケンスだとします。

--- Record1:ID; NAME; SURNAME
--- Record2:AGE; SEX;

R1をRecord1を表すクラス、R2をRecord2を表すクラスと呼びましょう
。この時点で、R1の配列とR2の別の配列があり
ます。5つのフィールドを持つSubjectというPOCOがある場合、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のままです。
ただし、2番目のマッピング後、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();

アップデート

多くのプロパティをコピーする必要がある場合は、ValueInjecterをご覧ください。InjectFrom()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 に答える