web-dev-qa-db-ja.com

AutoMapperで匿名オブジェクトをクラスにマップする方法

私はエンティティを持っています:

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; }
}

そしてモデル:

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; }
}

そして、私はこのようなエンティティをクエリします(-[〜#〜] ef [〜#〜]または[〜#〜] nh [〜#〜]によって):

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

ここで、tagsAnonを(匿名オブジェクトとして)TagModelのコレクションにマッピングする方法を教えてください(例:ICollection<TagModel>またはIEnumerable<TagModel>)?出来ますか?

39
agent47

Update 2019-07-31CreateMissingTypeMapsはAutoMapper v8で非推奨となり、v9で削除されます =。

自動作成されたマップのサポートはバージョン9.0で削除されます。手動または明示的にマップを構成する必要があります反射。 属性マッピング も考慮してください。


Update 2016-05-11DynamicMap is obsolete

次に、CreateMissingTypeMapstrueに設定する構成からマッパーを作成する必要があります。

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();

はい、可能です。所有している匿名オブジェクトごとに、オートマッパーのMapperクラスのDynamicMap<T>メソッドを使用する必要があります。このようなもの:

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

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

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

なぜこれを行うことができないのですか?

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

これは動作するはずですが、失敗します(DynamicMapはコレクションに対して不明瞭であると読みました)。

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

これは、DynamicMapが列挙型ではないように見えるだけでなく、anonタイプでも機能することを証明しています。

var destination = Mapper.DynamicMap<TagModel>(tagsAnon);
2
Justin Pihony

最新のAutomapperでこれを実現するカスタム関数を作成できます。上記の他の回答で述べたように、CreateMissingTypeMapsプロパティを使用します。

public static List<T> MapDynamicList<T>(IEnumerable<object> obj)
    {
        var config = new MapperConfiguration(c => c.CreateMissingTypeMaps = true);
        var mapper = config.CreateMapper();

        var newModel = obj.Select(mapper.Map<T>).ToList();

        return newModel;
    }

次に、次の1行のコードで関数を呼び出すだけです。

var viewModel = Models.Helper.MapDynamicList<MatchSubCategory>(model);

ここで、modelIEnumerable<object>またはList<object>

0
vohrahul