मुझे आज भी यही समस्या थी और मेरा समाधान योडा सूचीबद्ध के समान था, हालांकि यह केवल धाराप्रवाह वाक्य रचना के साथ काम करता है।
अपने कोड के लिए मेरे समाधान को अपनाना: मैंने ऑब्जेक्ट क्लास में निम्नलिखित स्टैटिक विधि जोड़ी
/// <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
};
}
और फिर आधार क्वेरी को निम्न में अपडेट किया:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
यह क्लास / डेटा ट्रांसफर ऑब्जेक्ट के लिए सदस्य प्रारंभ के ब्लोट को धकेलने के लाभ के साथ जेम्स मैनिंग के समाधान के लिए तार्किक रूप से समतुल्य है।
नोट: मूल रूप से मैं अधिक वर्णनात्मक नामों का उपयोग कर रहा था जो कि "इनिशियलाइज़र" था लेकिन मैं इसका उपयोग कैसे कर रहा था, इसकी समीक्षा करने के बाद, मैंने पाया कि "Initilizer" पर्याप्त था (कम से कम मेरे उद्देश्यों के लिए)।
अंतिम नोट:
इस समाधान के साथ आने के बाद, मैं मूल रूप से सोच रहा था कि एक ही कोड को साझा करना सरल होगा और इसे क्वेरी सिंटैक्स के लिए भी काम करना होगा। मैं अब ऐसा नहीं मानता हूं कि ऐसा होना चाहिए। मुझे लगता है कि यदि आप इस प्रकार के आशुलिपि निर्माण का उपयोग करने में सक्षम होना चाहते हैं, तो आपको प्रत्येक (क्वेरी, धाराप्रवाह) धाराप्रवाह के लिए एक विधि की आवश्यकता होगी जैसा कि ऊपर वर्णित है जो ऑब्जेक्ट क्लास में ही मौजूद हो सकता है।
क्वेरी सिंटैक्स के लिए एक एक्सटेंशन विधि (या बेस क्लास के बाहर कुछ विधि का उपयोग किया जा रहा है) की आवश्यकता होगी। (चूंकि क्वेरी सिंटैक्स T के बजाय एक IQueryable संचालित करना चाहता है)
यहाँ एक नमूना है जिसे मैंने अंततः क्वेरी सिंटैक्स के लिए काम करने के लिए उपयोग किया था। (योदा ने पहले ही इसे पकड़ लिया था लेकिन मुझे लगता है कि उपयोग स्पष्ट हो सकता है क्योंकि मुझे यह पहले नहीं मिला था)
/// <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
};
}
और उपयोग
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();