5

में एसक्यूएल के साथ अटक गया है, मैं एक प्रश्न तेज करने के लिए मानदंड का उपयोग कर रहा हूं, और मैं लगभग वहां हूं।NHibernate मानदंड QueryByExample मध्य में

किसी तालिका में पंक्तियों से मेल खाने के लिए क्वेरी द्वारा क्वेरी का उपयोग करके, उसी आईडी के साथ डुप्लिकेट पंक्तियां हटाएं, और फिर पेजिनेट करें।

बेशक मैं डुप्लिकेट पंक्तियों को हटाए जाने तक पेजिंग नहीं कर सकता, और मुझे नहीं पता कि यह कैसे करना है। यह एसक्यूएल में किया जा सकता है, लेकिन फिर यह धाराप्रवाह कोड के साथ फिट हो जाता है, ISQLQuery एक आईसीआरटीरिया वस्तु वापस नहीं करता है।

public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize) 
    { 
     var startRow = startingPage * pageSize; 

     // Query By Example. 
     var example = Example.Create(exampleEntitySearch) 
      .IgnoreCase() 
      .EnableLike(MatchMode.Anywhere) 
      .ExcludeZeroes(); 

     var results = this.Session.CreateCriteria(typeof(EntitySearch)) 
           .Add(example) 
     // select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1 
           .SetFirstResult(startRow) 
           .SetMaxResults(pageSize) 
           .List<DealSearch>(); 

     return results; 
    } 

सलाह मैं पढ़ा है NHibernate में SQL क्वेरी लिखने के लिए है, लेकिन मुझे नहीं लगता कि कर सकते हैं कि निफ्टी "ROW_NUMBER() विभाजन एसक्यूएल पर" कन्वर्ट करने के लिए। मैं इसे पहले खत्म करने के लिए काम खत्म करना चाहता हूं, फिर इसे और अधिक सुरुचिपूर्ण बनाओ।

मैं इस स्पाइक को उत्पादन में प्राप्त करना चाहता हूं और ~ 90% गति को साबित करना चाहता हूं।

+0

खैर आप NHibernate में हार्ड-कोडेड एसक्यूएल निष्पादित कर सकते हैं आपका कोड लेकिन फिर आप लाभों का एक समूह खो देते हैं NHHernate आपको टाइप-सुरक्षा (कक्षाओं के मानचित्र से डीबी ऑब्जेक्ट्स के मजबूत मानचित्र से मजबूत टाइपिंग) देता है, डीबी इंजन के लिए अज्ञेयवादी होने के कारण (अधिक जटिल एसक्यूएल सभी डीबी पर नहीं चलेंगे) धीरे लोड हो रहा है, कैशिंग, इत्यादि। मैं अनुशंसा करता हूं, जब तक कि बिल्कुल जरूरी न हो और आप निश्चित हैं कि आप कभी भी डीबी इंजन स्विच नहीं करेंगे, एनएचबीर्नेट के साथ कोड में हार्ड-कोडेड एसक्यूएल का उपयोग न करें। –

+0

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

+0

एक अनुभवी टीम है जो इस मंच पर आपकी मदद कर सकती है: http://sqlserver.ro, –

उत्तर

0

मैं प्रदर्शन के बारे में यकीन नहीं है, लेकिन आप इस्तेमाल कर सकते हैं LINQ:

बदलें:

.List<DealSearch>(); 

करने के लिए:

.List<DealSearch>().Distinct().ToList(); 
+0

कोशिश करें मानदंड का उपयोग करने का विचार सर्वर पर प्रसंस्करण करना है, और सर्वर को स्थानांतरित करने के लिए डेटा को कम करें । NHibernate के लिए LINQ केवल डेटा वितरित होने के बाद ही काम करेगा। SQL सर्वर पर .NET है, हालांकि, मैंने कुछ नहीं सोचा है। – zeristor

+0

मिल गया ', मुझे सर्वर-साइड (जो सही समझ में आता है) करने के बारे में हिस्सा चूक गया, मैं बस एक अलग परिणाम सेट प्राप्त करने के लिए देख रहा था। मेरे पास अभी देखने के लिए समय नहीं है, लेकिन क्या आपने एक DistinctEntityRootTransformer का उपयोग कर SetResultTransformer को देखा है? –