2013-05-14 5 views
5

मैंने एक सूचीदृश्य भरने के लिए एक LINQ क्वेरी लिख रही है लेकिन यह .ToString() विधि का उपयोग करता है जो apparely की अनुमति नहीं है।LINQ प्रश्नों में ToString() का उपयोग करना?

Error: LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression

वहाँ toString() LINQ में उपयोग करने के लिए एक रास्ता है या अगर यह संभव नहीं है क्वेरी में स्ट्रिंग के लिए दिनांक समय परिवर्तित करने का हल क्या है: जब मैं नीचे दिए गए कोड का उपयोग मैं त्रुटि संदेश मिलता है । कृपया गाँठ कि ReleaseDateName एक स्ट्रिंग है और RELEASEDATE दिनांक समय है

using (var db = new ReleaseInfo()) 
{ 
    lvReleaseInfo.DataSource = (from r in db.MediaReleases 
           join rn in db.ReleaseNames 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rn.MediaReleaseID, rn.CultureCodeID } 
           join plat in db.MediaPlatforms 
           on new { MediaPlatformID = r.MediaPlatformID, CultureCodeID } equals new { plat.MediaPlatformID, plat.CultureCodeID } 
           join pub in db.MediaPublishers 
           on new { MediaPublisherID = r.MediaPublisherID, CultureCodeID } equals new { pub.MediaPublisherID, pub.CultureCodeID } 
           join c in db.Countries 
           on new { CountryID = r.CountryID, CultureCodeID } equals new { c.CountryID, c.CultureCodeID } 
           join rd in db.ReleaseDates 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rd.MediaReleaseID, rd.CultureCodeID } 
           join a in db.AffiliateLinks 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { a.MediaReleaseID, a.CultureCodeID } 
           where r.SectionID == SectionID 
           select new 
           { 
            rn.ReleaseTitle, 
            plat.MediaPlatformName, 
            pub.MediaPublisherName, 
            c.CountryName, 
            ReleaseDate = (rd.ReleaseDate == null ? rd.ReleaseDateName : rd.ReleaseDate.ToString()), 
            a.AffiliateLinkAddress 
           }).ToList(); 
    lvReleaseInfo.DataBind(); 
} 

उत्तर

7

तुम वैसे भी सूचीबद्ध करने के लिए, आप, बल्कि आरडीबीएमएस की तुलना में इस तरह नेट पक्ष पर रूपांतरण कर सकता है, आपकी क्वेरी materializing कर रहे हैं के बाद से:

... 
select new { 
    rn.ReleaseTitle, 
    plat.MediaPlatformName, 
    pub.MediaPublisherName, 
    c.CountryName, 
    rd.ReleaseDateName, 
    rd.ReleaseDate, 
    a.AffiliateLinkAddress 
}).AsEnumerable() // <<== This forces the following Select to operate in memory 
.Select(t => new { 
    t.ReleaseTitle, 
    t.MediaPlatformName, 
    t.MediaPublisherName, 
    t.CountryName, 
    ReleaseDate = t.ReleaseDateName ?? t.ReleaseDate.ToString() 
    t.AffiliateLinkAddress   
}).ToList(); 

ToString() के बाद से IEnumerable<T> से एक तत्व पर कहा जाता है, यह अब असफल हो जायेगी। नल-चेकिंग ? : सशर्त के स्थान पर ?? ऑपरेटर का उपयोग भी ध्यान दें।

+0

मैं LINQ से Etityes के लिए नया हूं, क्या आप समझा सकते हैं कि चयन करें। चयन भाग कैसे काम करता है? –

+2

@MatthewVerstraete 'चयन करें 'बस विधि वाक्यविन्यास है। यह वही है जब आप क्वेरी सिंटैक्स में 'select' का उपयोग करते हैं। 't => {...} 'एक लैम्ब्डा अभिव्यक्ति है। यह मूल रूप से प्रत्येक तत्व के लिए कह रहा है जिसे हम चुनते हैं जो '=>' ऑपरेटर के दाईं ओर है। – evanmcdonnal

+0

धन्यवाद, मैं इसे SQL सर्वर पर प्रो में परिवर्तित करने के बारे में भी सोच रहा था क्योंकि यह काफी पूर्ण रूप से शामिल है। एक प्रो में कनवर्ट करने से मुझे SQL सर्वर की तरफ तर्क भी करने की अनुमति मिल जाएगी। क्या आपकी विधि बनाम प्रो जाने के लिए एक सभ्य प्रदर्शन अपग्रेड होगा? –

0

समस्या यह है कि आप किसी क्षेत्र पर ToString() को कॉल नहीं कर सकते हैं जब तक कि इसे deserialized नहीं किया जाता है। इसलिए, क्वेरी में ToString() पर कॉल करने का प्रयास करने के बजाय, इसे बाद में परिणामों पर करें।

डेटाबेस में जिस मान पर आप काम कर रहे हैं उसके पास ToString() की कोई धारणा नहीं है, यही कारण है कि आपको त्रुटि मिलती है। क्वेरी सी # कोड की तरह लग सकती है और महसूस कर सकती है लेकिन ध्यान रखें कि कवर के तहत किसी अन्य क्वेरी की तरह SQL क्वेरी में परिवर्तित किया जा रहा है। सूची वापस पाने के बाद आप समस्या को हल करने के लिए एक बहुत ही सरल LINQ क्वेरी लिख सकते हैं।

संबंधित मुद्दे