私はエンティティを持っています:
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>
)?出来ますか?
Update 2019-07-31: CreateMissingTypeMaps
はAutoMapper v8で非推奨となり、v9で削除されます =。
自動作成されたマップのサポートはバージョン9.0で削除されます。手動または明示的にマップを構成する必要があります反射。 属性マッピング も考慮してください。
Update 2016-05-11: DynamicMap is obsolete 。
次に、CreateMissingTypeMaps
をtrue
に設定する構成からマッパーを作成する必要があります。
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();
これが可能かどうかは完全にはわかりません。提案:
なぜこれを行うことができないのですか?
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);
最新の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);
ここで、model
はIEnumerable<object>
またはList<object>
。