Automapper handhabt leicht das Zuordnen einer Liste von Objekttypen zu einer anderen Liste von verschiedenen Objekttypen, aber ist es möglich, eine bestehende Liste mit einer ID als Schlüssel zuordnen zu lassen?Kartenliste zu existierender Liste in Automapper mit einem Schlüssel
5
A
Antwort
7
Ich habe keinen besseren Weg als die folgenden gefunden.
Hier sind Quelle und Ziel.
public class Source
{
public int Id { get; set; }
public string Foo { get; set; }
}
public class Destination
{
public int Id { get; set; }
public string Foo { get; set; }
}
Konverter definieren (Sie sollten Liste ändern <> zu welcher Art auch immer Sie verwenden).
public class CollectionConverter: ITypeConverter<List<Source>, List<Destination>>
{
public List<Destination> Convert(ResolutionContext context)
{
var destinationCollection = (List<Destination>)context.DestinationValue;
if(destinationCollection == null)
destinationCollection = new List<Destination>();
var sourceCollection = (List<Source>)context.SourceValue;
foreach(var source in sourceCollection)
{
Destination matchedDestination = null;
foreach(var destination in destinationCollection)
{
if(destination.Id == source.Id)
{
Mapper.Map(source, destination);
matchedDestination = destination;
break;
}
}
if(matchedDestination == null)
destinationCollection.Add(Mapper.Map<Destination>(source));
}
return destinationCollection;
}
}
Und hier ist die tatsächliche Zuordnung Konfiguration und Beispiel.
Mapper.CreateMap<Source,Destination>();
Mapper.CreateMap<List<Source>,List<Destination>>().ConvertUsing(new CollectionConverter());
var sourceCollection = new List<Source>
{
new Source{ Id = 1, Foo = "Match"},
new Source{ Id = 2, Foo = "DoesNotMatchWithDestination"}
};
var destinationCollection = new List<Destination>
{
new Destination{ Id = 1, Foo = "Match"},
new Destination{ Id = 3, Foo = "DoeNotMatchWithSource"}
};
var mergedCollection = Mapper.Map(sourceCollection, destinationCollection);
Sie sollten das folgende Ergebnis erhalten.
1
fand ich diesen Artikel sehr nützlich und als solche ich dachte, ich würde in meiner generische Version des Typ-Wandler rückzukoppeln, die Sie die Eigenschaft verwenden können, um wählen Sie aus jedem Objekt übereinstimmen, auf.
es alles, was Sie brauchen, zu verwenden ist zu tun:
// Example of usage
Mapper.CreateMap<UserModel, User>();
var converter = CollectionConverterWithIdentityMatching<UserModel, User>.Instance(model => model.Id, user => user.Id);
Mapper.CreateMap<List<UserModel>, List<User>>().ConvertUsing(converter);
//The actual converter
public class CollectionConverterWithIdentityMatching<TSource, TDestination> :
ITypeConverter<List<TSource>, List<TDestination>> where TDestination : class
{
private readonly Func<TSource, object> sourcePrimaryKeyExpression;
private readonly Func<TDestination, object> destinationPrimaryKeyExpression;
private CollectionConverterWithIdentityMatching(Expression<Func<TSource, object>> sourcePrimaryKey, Expression<Func<TDestination, object>> destinationPrimaryKey)
{
this.sourcePrimaryKeyExpression = sourcePrimaryKey.Compile();
this.destinationPrimaryKeyExpression = destinationPrimaryKey.Compile();
}
public static CollectionConverterWithIdentityMatching<TSource, TDestination>
Instance(Expression<Func<TSource, object>> sourcePrimaryKey, Expression<Func<TDestination, object>> destinationPrimaryKey)
{
return new CollectionConverterWithIdentityMatching<TSource, TDestination>(
sourcePrimaryKey, destinationPrimaryKey);
}
public List<TDestination> Convert(ResolutionContext context)
{
var destinationCollection = (List<TDestination>)context.DestinationValue ?? new List<TDestination>();
var sourceCollection = (List<TSource>)context.SourceValue;
foreach (var source in sourceCollection)
{
TDestination matchedDestination = default(TDestination);
foreach (var destination in destinationCollection)
{
var sourcePrimaryKey = GetPrimaryKey(source, this.sourcePrimaryKeyExpression);
var destinationPrimaryKey = GetPrimaryKey(destination, this.destinationPrimaryKeyExpression);
if (string.Equals(sourcePrimaryKey, destinationPrimaryKey, StringComparison.OrdinalIgnoreCase))
{
Mapper.Map(source, destination);
matchedDestination = destination;
break;
}
}
if (matchedDestination == null)
{
destinationCollection.Add(Mapper.Map<TDestination>(source));
}
}
return destinationCollection;
}
private string GetPrimaryKey<TObject>(object entity, Func<TObject, object> expression)
{
var tempId = expression.Invoke((TObject)entity);
var id = System.Convert.ToString(tempId);
return id;
}
}
Verwandte Themen
- 1. Python: Kartenliste zu einem dict
- 2. Kartenliste von Wörterbüchern
- 3. ConflictingBeanDefinitionException mit nicht existierender Klasse
- 4. Automapper Mapping Liste <T> zu Klasse mit T
- 5. Zuordnung von Liste nach Objekt mit AutoMapper
- 6. reduzieren Schlüssel, Liste (Werte) zu Schlüssel, Wert mit Skala
- 7. C++, Anzeige einer Liste existierender Objekte in einem Multiset, nach bestimmten Kriterien
- 8. Migrieren zu Automapper 4.2.1 von Automapper 2.2.1
- 9. Schienenmodellgenerator - aus existierender Datenbank
- 10. Waterline.js Joins/Populate mit existierender Datenbank
- 11. Methode zu bereits existierender Schnittstelle mit ReSharper extrahieren
- 12. Zendcart - Zusammenführen existierender Benutzerdatenbank mit Zendcart Datenbank
- 13. Existierender Standard Funktor/Funktion um Gleichheit zu 0 zu prüfen?
- 14. Mit AutoMapper mit Data Reader
- 15. AutoMapper: JSON Konvertierung zur Liste von Objekten
- 16. Fehlerkorrektur mit einem Schlüssel
- 17. Karte mit einem mehrwertigen Schlüssel?
- 18. Automapper Mapping Ausnahme mit Listen zu Listen
- 19. Individuelle Mapping mit AutoMapper
- 20. Android Liste der Werte mit Schlüssel
- 21. sstable2json error - nicht existierender Schlüsselbereich
- 22. Wie man eine Liste mit AutoMapper auf zwei Listen abbildet?
- 23. AutoMapper wie Liste von einem Objekt zur Liste eines anderen Objekts abzubilden
- 24. Hinzufügen eines Werts zu einer Liste zu einem bereits vorhandenen Schlüssel in Karte
- 25. Kann Automapper von einem Wörterbuch von Eigenschaften zu einem flachen Ziel mappen?
- 26. Zuordnungs-Liste von Objekten aus übergeordneten Klasse mit AutoMapper
- 27. Wie bekomme ich die Liste der Schlüssel in einem Wörterbuch?
- 28. AutoMapper viele zu viele Beziehung in Sammlung
- 29. Dropzone.js in existierender Form mit PHP-Backend implementieren
- 30. Mapping Sammlungen mit AutoMapper