2010-06-08 11 views
5

पर कैसे चालू करें मैं अपने linq क्वेरी में बाद में आलसी लोड के लिए एक निश्चित चयन आइटम बनाना चाहता हूं। यहाँ मेरी क्वेरीइस LINQ क्वेरी को आलसी लोडिंग

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count() //this should load latter 
      }; 

मैं चयन क्वेरी में FavoriteCount आइटम हटा दिया है और बाद में जोड़ा कुछ शर्तों के आधार बा को यह चाहते हैं। यहां जिस तरह से मुझे आलसी लोड किया गया है

if (GetFavoriteInfo) 
{ 
    posts = posts.Select(x => new { FavoriteCount = context.PostVotes.Where(y => y.PostVote_postid == x.post_id).Count() }); 
} 

मुझे उपरोक्त क्वेरी के साथ एक वाक्यविन्यास त्रुटि मिल रही है। मैं इस

उत्तर

2

को ठीक कैसे करूं जब आप पहले की क्वेरी में FavoriteCount हटाते हैं, तो अज्ञात प्रकार जो posts को सौंपा गया है, उस क्षेत्र में अब और नहीं है; फिर दूसरी क्वेरी में आप बना रहे हैं अनाम प्रकार केवल में FavoriteCount है - इसलिए जब आप posts पर फिर से असाइन करने का प्रयास करते हैं तो आपको एक असंगत प्रकार त्रुटि मिलती है।

एक तरीका यह है पहली क्वेरी में FavoriteCount छोड़ने के लिए होगा, लेकिन यह FavoriteCount = -1 (या कुछ अन्य मूल्य इंगित करने के लिए यह अभी तक लोड नहीं किया गया है), और फिर एक दूसरे में आप कर सकते हैं बनाने के लिए:

posts = posts.Select(p => new { // reassign existing stuff, 
           p.post_date, 
           p.post_id, 
           p.post_titleslug, 
           p.post_votecount, 
           FavoriteCount = context.etc.etc. 
           }); 

आपको पुन: असाइनमेंट करना होगा क्योंकि अज्ञात प्रकार अपरिवर्तनीय हैं; उसके आस-पास एक तरीका उन क्षेत्रों के साथ PostInfo कक्षा बनाना होगा, फिर आप दूसरी क्वेरी में FavoriteCount सेट कर सकते हैं।

+0

मैं this..Would पर एक नौसिखिया आप reassignments का एक उदाहरण है कर रहा हूँ? – Luke101

+0

@ Luke101: उदाहरण अपडेट किया गया। – tzaman

1

1.- प्रकार है कि आप पहले वर पर पेश कर रहे हैं दूसरी असाइनमेंट पर एक ही प्रकार के बाद से पहले एक एक Anonymus प्रकार

है तो आप इस

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = GetFavoriteInfo?context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count():null //this should load latter 
      }; 
+0

मेरे पास एक ही विचार था - लेकिन एल 2 एस इसे एसक्यूएल केस स्टेटमेंट में अनुवाद करता है और एसएसएमएस में निष्पादन योजना से यह पता चलता है कि GetVavoriteInfo सत्य या गलत है या नहीं। –

1

यह blog entry कोशिश कर सकते हैं नहीं है आपकी सहायता करेगा। एक और बात, आप डेटा संदर्भ ऑब्जेक्ट की निम्न प्रॉपर्टी का उपयोग करके आलसी लोडिंग को सक्षम/अक्षम कर सकते हैं।

context.DeferredLoadingEnabled = false; 
संबंधित मुद्दे