Witam,
Mam niewielki problem podczas zaciągania danych z bazy danych i mapowaniu ich do ViewModeli.
Przykładowa baza:
https://zapodaj.net/319f773ac7b0a.png.html
Przykładowy Diagram klas
https://zapodaj.net/11d757d06da6c.png.html
Aby zmapować dane z bazy do ViewModeli używałem wcześniej selecta przypisująć wartości atrybutów z danych pól
Na przykład
public OwnedCarViewModel GetOwnedCar(Guid id)
{
using (var db = new ErdimContext())
{
var model =
from c in db.Car
select new OwnedCarViewModel()
{
MachineName = c.Machine.Name + c.Machine.Capacity,
FullName = c.Driver.FirstName + c.Driver.SecondName ,
VIN = c.VIN ,
Registration = c.Registration
};
return model;
}
}
public SoldCarViewModel GetSoldCar(Guid id)
{
using (var db = new ErdimContext())
{
var model =
from c in db.Car
select new SoldCarViewModel()
{
MachineName = c.Machine.Name + c.Machine.Capacity
};
return model;
}
}
Działało to szybko i sprawnie ale z czasem powstało mi coraz więcej viewmodeli. Często te ViewModele potrzebowały zmapowania w taki sam sposób pewnych pól (np. MachineName).
Niestety powyższy sposób zmusił mnie bym dublował te mapowania w select, i niestety przy zmianah mapowania musiałem wyszukiwać w całym kodzie i zmieniać to ręcznie.
Wpadłem zatem na pomysł by użyć Automapper. Zrobiłem następującą konstrukcje:
CreateMap<Car, OwnedCarViewModel>()
.IncludeBase<Car, IMachineName>()
.IncludeBase<Car, IDriverName>()
;
CreateMap<Car, SoldCarViewModel>()
.IncludeBase<Car, IMachineName>()
;
CreateMap<Car, IMachineName>()
.ForMember(dest => dest.MachineName, opts => opts.MapFrom(c => c.Machine.Name + c.Machine.Capacity))
;
CreateMap<Car, IDriverName>()
.ForMember(dest => dest.FullName, opts => opts.MapFrom(c => c.Driver.FirstName + c.Driver.SecondName))
;
A moja nowa metoda w dao wyglądała tak:
public OwnedCarViewModel GetOwnedCar_WithAutomapper(Guid id)
{
using (var db = new ErdimContext())
{
var model = db.Car.Where(s => s.id == id).ProjectTo<OwnedCarViewModel>().First();
return model;
}
}
Rozwiazanie to ma tą zaletę że jeśli teraz zmieni się mapowanie MachineName to wystarczy mi zmienić to tylko w jednym miejscu, dodatkowo unikam dublowania kodu.
Niestety okrutną wadą tego rozwiązania jest czas działania. Metoda ta działa prawie 10-20 razy wolniej ....
I tu moje pytanie, czy jest jakiś inny sposób, szybszy poradzenia sobie z mapowaniem ?
Pozdrawiam