Linq2Entities. Jak wydzielić część zapytania do zewnętrznej funkcji/metody?

0

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.

1

Ale co tak naprawdę chcesz osiągnąć? Chodzi mi o efekt, nie o przykłady kodu.

0

Chodzi o ograniczenie liczby zapytań. Teraz mam kod, który dla każdego obiektu wykonuje selecta i tworzy obiekt contract, a chcę by jeden select zwracał wszystkie obiekty contract.

0

A nie wystarczy użyć Single zamiast ToList?

1 użytkowników online, w tym zalogowanych: 0, gości: 1