Bugün de aynı sorunu yaşadım ve çözümüm Yoda'nın listelediğine benziyordu, ancak yalnızca akıcı sözdizimi ile çalışıyor.
Çözümümü kodunuza uyarlamak: Nesne sınıfına aşağıdaki statik yöntemi ekledim
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (fluent syntax only)
/// </summary>
/// <returns></returns>
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
};
}
ve ardından temel sorguyu şu şekilde güncelledi:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Bu mantıksal olarak James Manning'in çözümüne eşdeğerdir ve üye başlatma şişkinliğini Sınıf / Veri Aktarım Nesnesine itme avantajına sahiptir.
Not: Başlangıçta "Başlatıcı" dan daha açıklayıcı isimler kullanıyordum, ancak onu nasıl kullandığımı gözden geçirdikten sonra "Başlatıcı" nın yeterli olduğunu buldum (en azından benim amaçlarım için).
Son Not:
Bu çözümü bulduktan sonra, aslında aynı kodu paylaşmanın ve bunu Sorgu sözdizimi için de çalışacak şekilde uyarlamanın basit olacağını düşünüyordum. Artık böyle olduğuna inanmıyorum. Bence bu tür bir steno yapıyı kullanmak istiyorsanız, yukarıda açıklandığı gibi her biri (sorgu, akıcı) için nesne sınıfının kendisinde var olabilecek bir yönteme ihtiyacınız olacaktır.
Sorgu sözdizimi için bir uzantı yöntemi (veya kullanılan temel sınıfın dışında bir yöntem) gerekli olacaktır. (sorgu sözdizimi T yerine IQueryable çalıştırmak istediğinden)
İşte sonunda bunu sorgu sözdizimi için çalıştırmak için kullandığım şeyin bir örneği. (Yoda bunu zaten çiviledi, ancak kullanımın daha net olabileceğini düşünüyorum çünkü ilk başta anlamadım)
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (query syntax only)
/// </summary>
/// <returns></returns>
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
};
}
ve kullanım
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();