webentwicklung-frage-antwort-db.com.de

wie ordne ich mit AutoMapper ein anonymes Objekt einer Klasse zu?

Ich habe eine Entität:

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

und ein Modell:

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

und ich frage die Entität wie folgt ab (vonEFoderNH):

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

Wie kann ich nun den tagsAnon(als anonymes Objekt ) einer Sammlung von TagModel(z. B. ICollection<TagModel> oder IEnumerable<TagModel>) zuordnen? Ist es möglich?

32
agent47

Ja, es ist möglich. Sie müssten die DynamicMap-Methode der Mapper-Klasse des Automappers für jedes anonyme Objekt verwenden. Etwas wie das:

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

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

Update : DynamicMap ist jetzt veraltet .

Jetzt müssen Sie einen Mapper aus einer Konfiguration erstellen, die CreateMissingTypeMaps auf true setzt:

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();
56
Caio Proiete

Ich bin mir nicht ganz sicher, ob das möglich ist. Vorschläge:

Warum kannst du das nicht einfach machen:

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

Diese SOLLTE Arbeit sollte jedoch fehlschlagen (Ich habe gelesen, dass DynamicMap für Sammlungen unecht ist.

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

Dies beweist, dass DynamicMap mit anon-Typen arbeitet, scheinbar nicht mit Aufzählern:

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

Sie können eine benutzerdefinierte Funktion erstellen, um dies mit dem neuesten Automapper zu erreichen. Es verwendet die CreateMissingTypeMaps -Eigenschaft, wie in anderen Antworten oben erwähnt.

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

Dann rufen Sie einfach die Funktion mit dieser einzelnen Codezeile auf:

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

wobei model der IEnumerable<object> oder List<object> ist.

0
vohrahul