2012-03-09 34 views
27

Iエンティティ有するAutoMapperで匿名オブジェクトをクラスにマップする方法は?</p> <pre><code>public class Tag { public int Id { get; set; } public string Word { get; set; } // other properties... // and a collection of blogposts: public ICollection<Post> Posts { get; set; } } </code></pre> <p>とモデル:

public class TagModel { 
    public int Id { get; set; } 
    public string Word { get; set; } 
    // other properties... 
    // and a collection of blogposts: 
    public int PostsCount { get; set; } 
} 

およびIは、(EF又はNHによって)このようなエンティティを照会:

var tagsAnon = _context.Tags 
    .Select(t => new { Tag = t, PostsCount = t. Posts.Count() }) 
    .ToList(); 

今、どのようにしてtagsAnonアノ野外の物体)をTagModel(例えば、 ICollection<TagModel>またはIEnumerable<TagModel>)?出来ますか?

+0

はなぜ 'TagModel'に直接' Tag'をマッピングしていませんか?なぜ中間オブジェクトですか? –

答えて

2

これが可能かどうか完全にはわかりません。提案:

var tagsAnon = _context.Tags 
    .Select(t => new TagModel { Tag = t, PostsCount = t. Posts.Count() }) 
    .ToList(); 

これは動作するはずです、しかし、それは(私はDynamicMapがコレクションにあやふやであることを読んだことが失敗した

これは、ことを証明している:。

は、なぜあなたはこれを行うことはできませんDynamicMapは列挙型のようには見えないが、アノノン型で動作する:

var destination = Mapper.DynamicMap<TagModel>(tagsAnon); 
47

はい、可能です。 AutomapperのMapperクラスのDynamicMapメソッドを、それぞれの匿名オブジェクトに対して使用する必要があります。このような何か:

var tagsAnon = Tags 
    .Select(t => new { t.Id, t.Word, PostsCount = t.Posts.Count() }) 
    .ToList(); 

var tagsModel = tagsAnon.Select(Mapper.DynamicMap<TagModel>) 
    .ToList(); 

更新DynamicMap is now obsolete

今あなたがtrueCreateMissingTypeMapsを設定し、設定からマッパーを作成する必要があります。

var tagsAnon = Tags 
    .Select(t => new { t.Id, t.Word, PostsCount = t.Posts.Count }) 
    .ToList(); 

var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true); 
var mapper = config.CreateMapper(); 

var tagsModel = tagsAnon.Select(mapper.Map<TagModel>) 
    .ToList(); 
+0

これはAutoMapper 4.1で廃止されました。 – MobileMon

+3

@MobileMon私は新しい方法で答えを更新しました。それを指摘してくれてありがとう。 –

+1

"CreateMissingTypeMaps = true"を使って確認できます。この回答には有効とマークする必要があります。ありがとう! –

関連する問題

 関連する問題