2011-03-10 17 views
12

में लाने मैं जो एक संग्रह लाने करें या सबसिलेक्ट मोड का उपयोग होगा एक प्रश्न QueryOver का उपयोग कर, बनाने के लिए कोशिश कर रहा हूँ। प्रश्न में इकाई Track है। मैं एक संग्रह TrackPrices बुलाया लोड करना चाहते हैं, और मैं प्रश्न में यह कर रहा हूं:निर्दिष्ट रणनीति (का चयन करें, में शामिल होने, आदि) nhibernate queryover क्वेरी

q = q.Fetch(item => item.TrackPrices).Eager; 

बहरहाल, यह एक छोड़ दिया, जो पृष्ठांकन के लिए एक समस्या में जो परिणाम में शामिल होने के पैदा करता है। मैं इसे एक अलग का चयन करना चाहूंगा या उप-चयन का चयन करें। कोई विचार अगर यह किया जा सकता है? जहाँ तक मुझे पता है, मापदंड एपीआई का उपयोग कर एक करना होगा:

q.DetachedCriteria.SetFetchMode("TrackPrices", FetchMode.Select); 

लेकिन मैं इस प्रकार मैं QueryOver एपीआई का उपयोग कर पसंद करेंगे कोड में जादू तार से बचना चाहते हैं,।

उत्तर

3

जब से मैंने इस प्रश्न को पोस्ट किया, तब से मैंने एक वर्कअराउंड/समाधान ढूंढने में कामयाब रहा, जिसे अन्य उपयोगी भी मिल सकते हैं।

असल में, इस तरह के मामले में आपको पहले एक और क्वेरी बनाना होगा जो मुख्य प्रश्न की प्राथमिक कुंजी को अंकन के साथ अलग-अलग चुनता है। चूंकि DISTINCT (ID) केवल वही परिणाम लौटाएगा जो आप चाहते हैं, आप बिना किसी समस्या के एसक्यूएल के पेजिनेशन का उपयोग कर सकते हैं। फिर, आप बिना किसी अंकन के मुख्य प्रश्न को फिर से चलाते हैं, लेकिन ऐसी स्थिति का उपयोग करते हैं जहां आईडी लौटाई गई सूची में से एक है। मैंने एक सामान्य विधि बनाई जो मानदंड लेता है, आईडी वापस लौटाता है और उन्हें मुख्य मानदंडों के लिए एक शर्त के रूप में जोड़ता है। नीचे दिए गए कोड:

public static void LimitCriteriaByPrimaryKeys(this NHibernate.ICriteria criteria, string primaryKeyName, int pageNum, int pageSize) 
    { 
     var session = NHManager.Instance.GetCurrentSessionFromContext(); 
     if (pageSize <= 0) pageSize = Int32.MaxValue - 1; 
     var nhSession = NHManager.Instance.GetCurrentSessionFromContext(); 
     var pagingCriteria = (ICriteria)criteria.Clone(); 
     IList ids = null; 
     var pKeyIDName = Projections.Property(primaryKeyName); 
     var pKeyProjection = Projections.Distinct(pKeyIDName); 
     { 
      { 
       //paging 
       pagingCriteria.SetProjection(pKeyProjection); //sets the primary key distinct projection 
       if (pageSize > 0) 
       { 

        if (pageNum < 1) 
         pageNum = 1; 
        int skipAmt = (pageNum - 1) * pageSize; 
        pagingCriteria.SetFirstResult(skipAmt); 
        pagingCriteria.SetMaxResults(pageSize); 

        ids = pagingCriteria.List(); //this returns the distinct list of IDs which should be returned for the given page & size 

       } 
      } 
     } 
     { 
      if (ids != null && ids.Count > 0) 
      { 
       criteria.Add(Expression.In(pKeyIDName, ids)); //adds the primary key restriction 
       var crit = criteria; 
       crit.SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer()); 
      } 
      else 
      { 
       criteria.Add(Expression.Eq(pKeyIDName, 0)); //this is added specifically so that the main criteria returns NO results 
       criteria.Add(Expression.Eq(pKeyIDName, 1)); 
      } 
     } 
    } 

तरीकों NHManager.Instance.GetCurrentSessionFromContext(); सत्र कारखाने से वर्तमान सत्र को पुनः प्राप्त करने के लिए अपना स्वयं विधि के साथ बदला जा सकता है।

उम्मीद है कि यह मदद करता है!

+0

क्या, के बारे में क्या मैं उत्सुक लोडिंग के साथ iqueryable के रूप में भंडार बनाने के रूप में जाना होगा। सूचियों के iqueryable संग्रह पर linq क्वेरी के माध्यम से पेजिनेशन के बाद। जहां आप उपयोग करते हैं। टेक (x) – cpoDesign

+0

लेकिन फिर, मुझे डेटाबेस से सभी संग्रह स्वयं लोड करना होगा। यदि आपके पास बहुत सारे रिकॉर्ड हैं, तो यह बेहद अपर्याप्त और महंगा है, साथ ही धीमा है। –

1

मैं जानता हूँ कि यह आपके लिए क्या कहा, लेकिन सबसे खराब स्थिति आप यहाँ विभिन्न तरीकों का उपयोग कर एक प्रकार सुरक्षित तरीके से अपने जादू तार संपुटित कर सकते हैं नहीं है: C# String enums

1

का मेल पेजिंग और उत्सुक प्राप्त कर रहा है मुश्किल है।

यदि आप मानदंड API के माध्यम से चयन करने के लिए fetch निर्दिष्ट करते हैं तो TrackPrices में प्रत्येक आइटम अलग क्वेरी - N + 1 समस्या में लोड किया जाएगा। आपको उत्सुक लोडिंग के साथ परेशान करने की आवश्यकता नहीं है।

आप एन + 1 समस्या को कम करने के लिए मैपिंग में ट्रैकप्रिसेस के लिए बैच आकार सेट कर सकते हैं। इस article में उत्सुक fetching और पेजिंग मिश्रण के बारे में कुछ विवरण हैं।

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