Miałem dzisiaj ten sam problem i moje rozwiązanie było podobne do tego, które wymienił Yoda, jednak działa tylko z płynną składnią.
Dostosowanie mojego rozwiązania do twojego kodu: dodałem następującą metodę statyczną do klasy obiektu
public static Func<Naleznosci, Payments> Initializer()
{
return n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
a następnie zaktualizowałem zapytanie podstawowe do następującego:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Jest to logicznie równoważne z rozwiązaniem Jamesa Manninga, ale ma tę zaletę, że przenosi nadmiar inicjalizacji elementu członkowskiego do obiektu transferu klasy / danych
Uwaga: Początkowo używałem bardziej opisowych nazw niż „Initializer”, ale po przejrzeniu, jak go używam, stwierdziłem, że „Initilizer” był wystarczający (przynajmniej do moich celów).
Uwaga końcowa:
Po wymyśleniu tego rozwiązania początkowo myślałem, że udostępnienie tego samego kodu i dostosowanie go do pracy również ze składnią zapytań będzie proste. Nie wierzę już, że tak jest. Myślę, że jeśli chcesz móc używać tego typu skróconej konstrukcji, potrzebujesz metody dla każdego (zapytania, płynnego) biegłego, jak opisano powyżej, która może istnieć w samej klasie obiektów.
W przypadku składni zapytania wymagana byłaby metoda rozszerzenia (lub inna metoda spoza używanej klasy bazowej). (ponieważ składnia zapytania chce obsługiwać IQueryable zamiast T)
Oto próbka tego, czego użyłem, aby w końcu uruchomić to dla składni zapytań. (Yoda już to załatwił, ale myślę, że użycie mogłoby być jaśniejsze, ponieważ nie dostałem tego na początku)
public static IQueryable<Payments> Initializer(this IQueryable<Naleznosci> source)
{
return source.Select(
n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
i użytkowania
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();