Mam dwie tabele:
Persons
- kp_personId int
- name varchar
Cars
- kp_carId int
- name varchar
W serwisie utworzyłem metodę:
public IList<Person> GetPersons()
{
using(var Context = new MyAppEntities())
{
try
{
return Context.Persons.Include(x => x.Cars).AsDataContract();
}
catch(Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
return null;
}
}
}
gdzie AsDataContract to metoda rozszerzająca:
public static IList<Person> AsDataContract(this IQueryable<Persons> data)
{
return data.Select(x => new Person
{
kp_personId = x.kp_personId,
name = x.name,
Cars = x.Cars.Select(y => new Car
{
kp_carId = y.kp_carId,
name = y.name,
}).ToList(),
}).ToList();
}
Klasa Person [DataContract] ma postać:
[DataContract]
public class Person
{
[DataMember]
public int kp_personId { get; set; }
[DataMember]
public String name { get; set; }
[DataMember]
public IList<Car> Cars { get; set; }
}
W powyższym mogłem odczytać listę samochodów dla obiektu Person za pomocą Select-a.
Gdyby wnętrze tego Select-a trzeba było użyć wielokrotnie to można utworzyć
Expression<Func<Cars,Car>> GetCar
i zwyczajnie wstawić wszędzie gdzie chcemy odczytywać listę samochodów.
Co zrobić jednak gdy samochód jest jeden a nie jest ich lista?
Zamiast:
Cars = x.Cars.Select(y => new Car
{
kp_carId = y.kp_carId,
name = y.name,
}).ToList(),
mógłbym napisać
Car = new Car
{
kp_carId = x.Cars.kp_carId,
name = x.Cars.name,
},
i by to działa.
Ale jak przenieść to na zewnątrz tak jak we wcześniejszym przypadku dało się to zrobić za pomocą Expression?
Obiekt Car może być przecież obiektem złożonym, a wstawianie instrukcji new w każdym miejscu wygeneruje długi powtarzający się kod.
Czy jest możliwość wyrzucenia tego na zewnątrz?
Przeszukałem internet i nie znalazłem sposobu na pominięcie tego ograniczenia Linq2Entities.