Ich habe versucht, eine saubere und wiederverwendbare Möglichkeit zu finden, Entitäten ihren DTOs zuzuordnen. Hier ist ein Beispiel dafür, was ich mir ausgedacht habe und wo ich feststecke.Der sauberste Weg, Entity zu DTO mit Linq Select zu kartieren?
Entities
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
// Other properties not included in DTO
}
public class Address
{
public int ID { get; set; }
public string City { get; set; }
// Other properties not included in DTO
}
DTOs
public class PersonDTO
{
public int ID { get; set; }
public string Name { get; set; }
public AddressDTO Address { get; set; }
}
public class AddressDTO
{
public int ID { get; set; }
public string City { get; set; }
}
Expressions
Dies ist, wie ich die Zuordnung zu behandeln begann. Ich wollte eine Lösung, die die Abfrage vor dem Mapping nicht ausführen würde. Mir wurde gesagt, dass wenn Sie eine Func<in, out>
statt Expression<Func<in, out>>
übergeben, dass es die Abfrage vor dem Mapping ausführen wird.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = new AddressDTO()
{
ID = person.Address.ID,
City = person.Address.City
}
}
}
Ein Problem dabei ist, dass ich bereits einen Ausdruck haben, die eine Address
zu einem Karten AddressDTO
so habe ich dupliziert Code. Dies wird auch unterbrochen, wenn person.Address
null ist. Das wird sehr schnell unordentlich, besonders wenn ich andere Entitäten anzeigen möchte, die sich auf eine Person in demselben DTO beziehen. Es wird ein Vogelnest von verschachtelten Abbildungen.
Ich habe das folgende versucht, aber Linq weiß nicht, wie man damit umgeht.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = Convert(person.Address)
}
public static AddressDTO Convert(Address source)
{
if (source == null) return null;
return new AddressDTO()
{
ID = source.ID,
City = source.City
}
}
}
Gibt es elegante Lösungen, die ich vermisse?
AutoMapper. Http://automapper.org/ – Christian
I Ich habe AutoMapper schon vorher benutzt, aber ich ging davon aus, dass die Abfrage vor dem Mapping ausgeführt werden musste. Nachdem ich in der Dokumentation nachgesehen habe, sieht es so aus, als hätte es etwas, was ich suche [HIER] (https: // github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions) – Jeff
Ihre Abfrage wird ausgeführt, wenn das Mapping durchgeführt wird, aber wenn es Felder in der Entität gibt, an denen Sie nicht interessiert sind, verwenden Sie 'Project(). To <>' which is verfügbar sowohl für NHibernate als auch für EntityFramework Felder, die in den Mapping-Konfigurationen angegeben sind. – Christian