2012-07-16 13 views
11

IQueryable को पूरा करने की कोशिश करते समय मुझे काफी अजीब अपवाद मिला है, मुझे NHibernate.Linq फॉर्म मिला है। Antlr.Runtime.Tree.RewriteEmptyStreamException का अपवाद सिर्फ plan b बताता है, और कुछ भी नहीं। विस्तृत अपवाद http://pastebin.com/kR2dvDHdचलने पर संदेश "प्लान बी" के साथ एंटर अपवाद एनएचबीरनेट इकाइयों के IQueryable

में पाया जा सकता यहाँ कोड है कि एक अपवाद फेंकता है:

var matterExtractor = new MatterExtractor(); 
var InactiveMatters = matterExtractor.GetMattersAtStatus(General.InactiveMatterStatus); 
Assert.IsNotNull(InactiveMatters); //OK 
Assert.IsInstanceOfType(InactiveMatters, typeof (IQueryable<Matter>)); // OK 
var MaterializedMatters = InactiveMatters.ToList(); //Exception is thrown 

पदार्थ एक्सट्रैक्टर वर्ग follwing के रूप में सरल है:

public class MatterExtractor 
{ 
    public virtual IQueryable<Matter> GetMattersAtStatus(MatterStatus status) 
    { 
     return 
      (new NHibernateRepository.Repository<Matter>()).Where(
       m => m.MatterStatusHistories.OrderByDescending(msh => msh.CreateTime).FirstOrDefault().MatterStatus == status); 
    } 
} 

NHibernateRepository.Repository<T> एक उपयोगिता वर्ग कि IQueryable लागू करता है NHibernate.LINQNHibernate.Session पर विस्तार विधियों के माध्यम से। http://pastebin.com/MgDxDg3Y

मुझे नहीं लगता कि यह अन्य परीक्षण है कि Matter इकाई रन ठीक के साथ बातचीत के बाद से NHibernate मैपिंग से संबंधित है,: कुछ नहीं विशिष्ट यहाँ, लेकिन सिर्फ मामले में, यहाँ सूची है। शायद यह Where खंड से संबंधित है, लेकिन मुझे समझ में नहीं आता कि उस खंड के साथ क्या गलत हो रहा है। मैं

OrderBy(msh => msh.CreateTime).LastOrDefault() 

को

OrderByDescending(msh => msh.CreateTime).FirstOrDefault() 

की जगह की कोशिश की है, लेकिन यह सिर्फ मेरे The LastResultOperator result operator is not current supported कहा, तो मुझे लगता है NHibernate.Linq सिर्फ LastOrDefault नहीं रह सकते हैं।

कोई विचार plan b का मतलब क्या है और मैं इसे कैसे काम कर सकता हूं?

+3

के रूप में बेहतर तरीके से उपयुक्त हो सकते हैं, मैं आपकी समस्या को दोबारा कर सकता हूं, इसलिए मैं कहूंगा कि यह एनएचबीर्नेट में एक बग है, या तो इसे क्वेरी उत्पन्न करनी चाहिए या इसे एक समर्थित अपवाद फेंकना चाहिए। आपको एक बग रिपोर्ट जमा करनी चाहिए। एक वर्कअराउंड के रूप में आप क्लाइंट साइड पर अपनी पूरी क्वेरी का मूल्यांकन कर सकते हैं या 'रिपोजिटरी <मैटरस्टैटस हिस्ट्री>' ... – nemesv

उत्तर

1

आपको लगता है कि कुछ कर रहे हैं OrderByDescending (MSH => msh.CreateTime) .FirstOrDefault()

अशक्त अपने भंडार में किसी भी तत्व के लिए वापस नहीं कर रहा है? मुझे लगता है कि कोड का थोड़ा सा मुझे प्रश्न में थोड़ा सा लगता है।

(... OrderByDescending (MSH => msh.CreateTime) .FirstOrDefault() ?? someDummyStatusNotSatisfyingClause)

आपकी समस्या का समाधान कर सकते।

एक और संभावना यह है कि आपने एनएचबीर्नेट को निर्देश दिया है कि इकाई परिभाषा में स्थिति इतिहास को कैसे व्यवस्थित किया जाए। एनएचबर्ननेट के साथ मेरा अनुभव यह है कि आपके जैसे कुछ प्रश्न एक रिपोजिटरी फ़ंक्शन (एक संग्रहीत प्रक्रिया)

+0

से शुरू करने के लिए अपनी क्वेरी को पुनर्गठित कर सकते हैं। दो साल पहले सवाल पूछा गया था। हां, मुझे यकीन है कि 'ऑर्डरबैडस्केंडिंग (...)' कभी वापस नहीं लौटा। दुर्भाग्यवश, मेरे पास उस कोड तक पहुंच नहीं है। साथ ही, एक संग्रहीत प्रक्रिया बनाना एक विकल्प नहीं था, क्योंकि जिस ऐप का मैं विकास कर रहा था वह एक बड़ी प्रणाली के लिए एक स्टैंडअलोन अतिरिक्त था; यह सीधे मुख्य सिस्टम डेटाबेस का उपयोग कर रहा था, इसलिए मुझे कोई स्कीमा परिवर्तन करने की अनुमति नहीं थी। – J0HN