2013-01-03 13 views
8

मैं सैद्धांतिक रूप से एक ही परिणाम लौटने इसी तरह के दो प्रश्न हैं:अप्रत्याशित Linq व्यवहार - ToList()

var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i => 
         i.Group != null && i.Group.Id == methodParameter) 
         .ToList(); 

यह अनुरोध 0 आइटम देता है, भले ही यह एक वापस करने के लिए माना जाता है। निम्नलिखित उत्तरार्द्ध का एक पुनर्लेख है लेकिन ToList() विधि पर कॉल के साथ। यह अनुरोध पहली क्वेरी में अपेक्षित आइटम को काम करता है और देता है!

var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i => 
        i.Group != null && i.Group.Id == methodParameter).ToList(); 

नोट: SessionManagement.Db.Linq<Item>(false) बूलियन विशेषता का निर्धारण करता है, तो अनुरोध कैश (सही) या डेटाबेस (गलत) में मार डाला जाना चाहिए के साथ एक सामान्य Linq NHibernate करने के लिए तरीका है। माना जाता है कि इस विधि में कुछ भी गलत नहीं है क्योंकि यह समाधान के कई अन्य हिस्सों में सामान्य रूप से काम करता है। आइटम का मानचित्रण कुछ भी नहीं है: कोई बैग और निम्न पैरामीटर: lazy="false" schema="dbo" mutable="false" polymorphism="explicit"

ऐसा क्यों है?

संपादित:

(Item.Group_ID is not null) and [email protected]',N'@p0 int',@p0=11768

requestWorking के उत्पन्न एसक्यूएल अनुरोध मोटे तौर पर एक select * from dbo.Items

+1

आप Sql सर्वर का उपयोग कर रहे हैं, तो आप एसक्यूएल प्रोफाइलर चल रहा है, जबकि इन प्रश्नों के दोनों चल की कोशिश की? – nerdybeardo

+0

i.Group दोनों के बीच अलग है। अलग-अलग प्रकार के संग्रहों पर समान रूप से नामित, लेकिन अलग-अलग अलग-अलग होते हैं। –

+1

कृपया जेनरेट एसक्यूएल पोस्ट करें। एसक्यूएल क्या करता है और सी # अर्थशास्त्र क्या निर्देशित करता है के बीच एक अर्थपूर्ण अंतर है। LINQ समान अर्थशास्त्र का वादा नहीं करता है। – usr

उत्तर

1

मैं c.Group.Id != null पर बहुत अपने सिद्धांत से रुचि थी, मैं तार्किक पाया जो भले ही यह मेरी समाधान में कोड के अन्य हिस्सों का खण्डन किया। हालांकि, इसे हटाने से कुछ भी नहीं बदला। मैंने पाया कि mutable="false" संपत्ति को हटाने से समस्या हल हो गई। यह थोड़ा जादुई लगता है लेकिन यह काम किया।

अनुरोध मैं पोस्ट तथ्य तरीकों अद्यतन/हटाए जाने की संभावना की जाँच में हो रहा में थे। मेरा निष्कर्ष यह है कि किसी भी तरह आइटम को अपरिवर्तनीय बनाने से नतीजे निकल गए। लेकिन मुझे समझ में नहीं आता है क्यों अनुरोध वर्किंग ने तब काम किया!

0

सभी मैं देख सकता हूँ कि है:

requestNoWorking के उत्पन्न एसक्यूएल अनुरोध के साथ समाप्त होता है दूसरे संस्करण में, आपके Where LINQ से NHibernate के बजाय LINQ से ऑब्जेक्ट्स द्वारा निष्पादित किया जाता है। तो पहले संस्करण को ऐसा कुछ करना चाहिए जो LINQ से NHibernate को अच्छी तरह से पचाना नहीं है।

मैं सोच यह i.Group != null कि LINQ करने के लिए NHibernate के साथ एक समस्या है है, देखना है कि null के उपयोग CLR-विशिष्ट है हूँ। रिक्त फ़ील्ड मानों के परीक्षण के लिए आपको LINQ से NHibernate में एक और निर्माण का उपयोग करने की आवश्यकता हो सकती है।

4

मुझे लगता है कि आप वहां जा रहे निबर्ननेट सत्र की बात कर रहे हैं जो एक क्वेरी करने योग्य है। यदि हां, तो पहली क्वेरी का मूल्यांकन .ToList() कॉल तक देरी हो रही है, और पूरी क्वेरी सर्वर पर चलती है। मैं सुझाव दूंगा कि यदि संभव हो तो एसक्यूएल सर्वर पर एक ट्रेस चलाएं, या संभवतः NHProf डाउनलोड करें ताकि वास्तविक क्वेरी निष्पादित की जा सके।

दूसरी क्वेरी का मूल्यांकन किया जाता है जैसे ही आप पहले .ToList() पर क्लिक करते हैं, ताकि आप पूरी तालिका को डीबी से वापस खींच रहे हों और फिर .net का उपयोग करके फ़िल्टर कर रहे हों। मैं ईमानदारी से आपको नहीं बता सकता कि वे अलग-अलग मूल्यांकन क्यों करेंगे, लेकिन मुझे लगता है कि मैपिंग/कॉन्फ़िगरेशन के साथ कुछ ऐसा है जो डीबी क्वेरी को थोड़ा गलत लिखा जा रहा है।

+3

मेरा अनुमान शून्य तुलना के आसपास कुछ होगा, एसक्यूएल नल तुलना हमेशा पीआईटीए होती है। – anydot

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