2010-04-12 7 views
5

I'am का उपयोग कर आवरण का उपयोग कर वास्तव में क्वेरी चलाने से पहले तालिका उपयोगकर्ता से कुछ डेटाLinq NHibernate आवरण मुद्दे पर जहां बयान

IQueryable<StarGuestWrapper> WhereQuery =  
session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
        u => 
        new StarGuestWrapper() 
         { 
          FullName = u.Name + " " + u.LastName, 
          LoginTime = u.SomeDateTime, 
          MonthsAsMember = u.SomeIntergerValue, 
          StarRating = u.SomeOtherInteregValue, 
          UserPicture = u.Photo.PhotoData, 
          InstructorFullName = u.SomeInstructorName, 
          TalkInteractionDuringSession = u.SomeBoolValue, 
          GoalInteractionDuringSession = u.SomeOtherBoolValue 
         }); 

मैं एक समस्या के बिना इस का उपयोग पाने के लिए के रूप में एक IQueryable तो मैं उपयोगी कर सकते हैं । पसंद:

WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList(); 

और इसी तरह।

समस्या पर 'कहां' कथन का उपयोग करने में समस्या होती है। उदाहरण के लिए:

WhereQuery.Where(s => s.StarRating == 1) 

क्रम कि 'StarRating' उपयोगकर्ता तालिका में मौजूद नहीं है में एक अपवाद फेंक देंगे - निश्चित रूप से ऐसा नहीं होता यह एक रैपर संपत्ति है। अगर मैं द्वारा

WhereQuery.AsEnumerable().Where(s => s.StarRating == 1) 

क्वेरी अमल में लाना है, लेकिन फिर यह IQueryable का उपयोग कर के सभी Sens खो देता है यह काम करेंगे और मैं यह करने के लिए नहीं करना चाहती।

अजीब और रोचक क्या है कि रैपर से सभी गुणों को फेंकने में त्रुटि नहीं है, सभी बूल मानों का विवरण कहां में किया जा सकता है। उदाहरण:

WhereQuery.Where(s => s.TalkInteractionDuringSession) 

यह EntityFramework में काम करता है, मैं क्यों NHibernate में इस त्रुटि मिलता है और यह कैसे तरह से मैं यह चाहता हूँ काम कर पाने के लिए?

+0

डेटा स्टोर में मौजूद किसी चीज़ पर क्वेरी (जो डेटा स्टोर का उपयोग करता है) पर आप कैसे पूछना चाहते हैं? StarRating = 1 के साथ उन सभी को ढूंढने का एकमात्र तरीका सबकुछ पर गिनना है। –

+0

@Lasse आपको यह समझने की प्रतीत नहीं होती है कि ओआरएम का काम कैसे होता है, यह एक क्वेरी नहीं है, यह एक डेटा नहीं है, इसमें डेटा शामिल नहीं है जो इस डेटा के लिए डेटाबेस से पूछताछ करता है। इस रैपर में हार्डकोड किए गए मानों को ध्यान में न रखें, यह केवल एक एक्सपेल है, मैंने आपको लिखा है। कुछ वैल्यू इसके बजाए। – Jacob

+0

यह * एक नया परिणाम प्रकार बनाने से पहले एक प्रश्न था, उस बिंदु पर आप कनेक्शन को डेटा स्टोर पर वापस तोड़ते हैं, आपके चयन कथन का नतीजा अब एक क्वेरी करने योग्य नहीं है जिसे आप जोड़ना जारी रख सकते हैं। जहां खंड हैं। यह इस प्रकार के कोड के समान है: चुनें * से (जादू सी # कोड यहां से चुनें (अपने * से चुनें *) –

उत्तर

2

ध्यान रखें कि पुराने nHibernate लिंक प्रदाता केवल आंशिक कार्यान्वयन है और अब सक्रिय रूप से काम नहीं किया जा रहा है। अब एक नया और अधिक पूर्ण लिनक प्रदाता विकसित किया जा रहा है और एनएच 3.0 का हिस्सा होगा (आप ट्रंक को चेकआउट कर सकते हैं और यह देखने के लिए इसे बना सकते हैं कि यह इस समस्या को संबोधित करता है या नहीं)।

मेरी सिफारिश उस बिंदु पर ToList() को कॉल करने के लिए अपना कोड बदलना है जब आप स्पष्ट रूप से डेटाबेस को हिट करना चाहते हैं। आप भविष्य में मूल्यवान क्वेरी को अपने भंडार से वापस भेज रहे हैं जिस बिंदु पर तकनीकी रूप से क्वेरी के साथ कुछ भी हो सकता है। यहां तक ​​कि ईएफ और LINQ2SQL एसक्यूएल में किसी भी संभावित linq क्वेरी का अनुवाद नहीं कर सकता है।

मुझे एहसास है कि यह ऐसा नहीं है जिसे आप करने में सक्षम होना चाहते हैं, लेकिन मुझे लगता है कि आप इस तरह से कुछ करने के लिए ढांचे को झुकाव करने की कोशिश कर रहे हैं, यह बिल्कुल स्वाभाविक नहीं है।

+0

क्रिस, अंतिम लिंक डीएलएल का संस्करण क्या है? 2.0? – NetSide

+0

मुझे नहीं पता, आपको शायद एनएचयूसर सूची –

+0

पर पूछना होगा शायद एनएच 3 का उल्लेख करना चाहिए।0 बस अल्फा रिलीज हिट करें और यदि आप इसे आजमाने की कोशिश करना चाहते हैं तो शायद काफी स्थिर है। –

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

  • कोई संबंधित समस्या नहीं^_^