2010-08-20 14 views
6

पहचान नहीं है जब मैं अपने संग्रह को उप-चयन में कॉल करने का प्रयास करता हूं, तो मुझे यह त्रुटि मिली। LINQ संस्थाओं के लिए विधि 'System.Linq.IQueryable`1 [aaa.Models को नहीं पहचानता है:LINQ से इकाइयों को विधि 'System.Linq.IQueryable

IGrpTextRepository rep = new GrpTextRepository(); 

     var query = new DetailViewModel 
     { 
      ViewDet = (from gh in _db.Grp 
         select new MultiDetailViewModel 
         { 
          Header = gh, 
          Txts = rep.FindAllLangTxtById(gh.GrpID) 

         }).ToList(), 
      Lang = _db.Language.ToList(), 

     }; 

मेरे इंटरफ़ेस

public interface IGrpTextRepository 
{ 
    IQueryable<GrpText> FindAllLangTxtById(int GrpID); 
} 

public class GrpTextRepository : IGrpTextRepository 
{ 
    DBEntities db = new DBEntities(); 

    public IQueryable<GrpText> FindAllLangTxtById(int GrpID) 
    { 
     return (from lang in db.Language 
       join gtxts in db.GrpText on lang.LangID equals gtxts.LangID into jointxt 
       from fintxt in jointxt.DefaultIfEmpty() 
       where fintxt.GrpID == GrpID 
       select fintxt); 
    } 


} 

यहाँ पूर्ण त्रुटि संदेश
System.NotSupportedException है .GrTText] FindAllLangTxtById (Int32) 'विधि, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है।

+0

इच्छा है कि मैं इसे संक्षेप में समझा सकता हूं ... आप पहले से ही IQueryable इंटरफेस, स्थगित निष्पादन, और अभिव्यक्ति पेड़ के बारे में कितना जानते हैं? – jfar

उत्तर

13

सरल समाधान आपके चयन (...) से पहले एक टोलीस्ट() जोड़ना है।

ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...) 

इस तरह प्रारंभिक अनुरोध डेटाबेस के लिए जाना जाएगा, परिणामों के साथ वापस आने और आप फिर उन्हें वस्तुओं के लिए Linq के खिलाफ एक का चयन करें कथन का उपयोग पुनः प्रक्षेपित कर सकते हैं।

लेकिन मैं पूछने के लिए क्यों समूहों और ग्रंथों और इस प्रकार के बीच एक FK संबंध दोनों के बीच एक इकाई एसोसिएशन तुम सिर्फ gh.GrpText पहुँच सकते हैं और ग्रंथों का संग्रह lazily लोड (या बेसब्री से भरी हुई को पाने के लिए अनुमति नहीं दे रहा है उपयोग करना शामिल है())।

जैसा कि @Doguhan Uluca टिप्पणियों में बताता है, ToList() का उपयोग जोखिम भरा है क्योंकि इससे उस तालिका में सब कुछ स्मृति में लाया जाएगा। आपको केवल इसे बहुत छोटे संग्रहों पर उपयोग करना चाहिए। सही तरीका आपके डेटाबेस डिज़ाइन को ठीक करना है ताकि आप इसे कुशलता से पूछ सकें।

+0

मेरे पास पहले से ही समूह और टेक्स्ट के बीच एक एफके है। । मैं अपनी भाषा तालिका के साथ बाएं जुड़ने के साथ एक सबक्वायरी बनाना चाहता हूं। मैं अलग-अलग लैंग में प्रत्येक समूह पाठ की सूची चाहता हूं। यदि समूह टेक्स्ट किसी विशिष्ट भाषा के लिए व्यापार नहीं करता है, तो मैं परिणाम को शून्य के रूप में चाहता हूं। –

+7

मैं आपकी डेटाबेस तालिका पर कॉल करने के लिए सलाह दूंगा। यह तब तक है जब तक कि आप पूरी तालिका को स्मृति में लोड नहीं करना चाहते हैं। –

+0

@DoguhanUluca - तो इस तरह की स्थिति में टोलीस्ट() को कॉल करने का विकल्प क्या है? – oonyalo

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