2012-04-18 7 views
6

मुझे अपने एंटिटी फ्रेमवर्क मॉडल में एक अजीब व्यवहार दिखाई दे रहा है। मैं एक प्रश्न है कि इस तरह दिखता है मिल गया है:एंटिटी फ्रेमवर्क एक पंक्ति के लिए शून्य देता है यदि उस पंक्ति में पहला कॉलम शून्य है

var rows = (from alarm in context.Alarms 
      join temp in context.ListDetails on alarm.ListDetailId equals temp.ListDetailId into entries from entry in entries.DefaultIfEmpty() 
      join read in context.Reads  on alarm.ReadId  equals read.ReadId 
      join plate in context.Images  on alarm.ReadId  equals plate.ReadId 
      where alarm.IActive == 1 && ! alarm.TransmittedAlarm 
      where read.IActive == 1 
      where plate.IActive == 1 && plate.ImageTypeId == 2 
      select new { alarm, entry, read, plate }).ToArray(); 

क्वेरी स्तंभ नाम से वर्णमाला के क्रम में सभी स्तंभों देता है। यह पता चला है कि परिणाम कॉल में कुछ पंक्तियों के लिए यह कॉलम न्यूल है। जब मैं डीबगर में पंक्तियों चर का विस्तार करता हूं, तो मुझे लगता है कि पूरी पंक्ति शून्य है!

संपादित करें: कुछ स्पष्टीकरण।

"पहला कॉलम" द्वारा, मेरा मतलब है कि पहली पंक्ति का पहला स्तंभ, यानी "चयन ए, बी, सी से ..." में, मेरा मतलब है ए। ऐसा होता है कि क्वेरी फ्रेमवर्क बनाता है वर्णित क्रम में सेट किए गए परिणाम में सभी कॉलम लौटाता है, और पहला वर्णमाला रूप से शून्य है और कुछ पंक्तियों के लिए शून्य है।

प्रश्न में कॉलम प्राथमिक कुंजी नहीं है; अगर यह प्राथमिक कुंजी थी, तो यह शून्य नहीं हो सका।

जब इकाई फ्रेमवर्क ऑब्जेक्ट में लौटाए गए डेटा की पंक्तियों को संसाधित करता है, तो यह प्रत्येक पंक्ति में पहले कॉलम के मान को देखता है। यदि वह कॉलम शून्य है, तो वह उस कॉलम सेट से संबंधित संपत्ति के साथ किसी ऑब्जेक्ट की बजाय पंक्ति के लिए शून्य पर वापस आ रहा है।

मुझे विश्वास नहीं है कि इसमें विशेष रूप से बाएं बाहरी शामिल होने के साथ कुछ भी करना है; यह बस होता है कि मेरी क्वेरी एक का उपयोग करती है। मैंने इसे सत्यापित करने के लिए कोई परीक्षण नहीं किया है, हालांकि, यह सिर्फ एक अनुमान है।

क्या किसी ने इसे पहले देखा है? क्या किसी के पास इसके लिए एक फिक्स है?

टोनी

+0

क्या आपको बाएं शामिल होने की आवश्यकता है? –

+0

आपको किस जगह में त्रुटि मिलती है? –

+0

क्या आप एसक्यूएल क्वेरी पोस्ट कर सकते हैं कि ईएफ डीबी को भेजता है? –

उत्तर

1

आप अपने में शामिल होने में DefaultIfEmpty का उपयोग करें। इसका मतलब यह है

कि शामिल होने कसौटी (alarm.ListDetailId equals temp.ListDetailId), मैं तुम्हें entries में प्रकार ListDetail (जो null है) की एक एकल डिफ़ॉल्ट मान रखना चाहता हूँ से मेल entries में कोई आइटम नहीं देखते हैं, तो।

इस मामले में ईएफ LEFT JOIN उत्पन्न करता है। वास्तव में, यह कोड Linq2Sql या EF के साथ LEFT JOIN उत्पन्न करने का प्रसिद्ध तरीका है।

LEFT JOIN कथन तालिका के सभी कॉलम के लिए NULL मानों का चयन करता है यदि तालिका में कोई पंक्ति JOIN मानदंड से मेल नहीं खाती है। असल में, एकमात्र कॉलम जो इकाई का पीके कॉलम है। ईएफ जांचता है कि पीके मान NULL है, यह तय करता है कि कोई इकाई मौजूद नहीं है और nullentries में रखती है। फिर आपको यह nullentry परिणामों की संपत्ति मान के रूप में मिलता है।

+0

मुझे बाएं बाहरी शामिल होने की आवश्यकता है। समस्या यह नहीं है कि 'प्रविष्टि' 'NULL' है; समस्या यह है कि 'अलार्म' में पहला कॉलम 'NULL' है और संपूर्ण चयन 'नया {अलार्म, एंट्री, रीड, प्लेट}' को 'एनयूएलएल' के रूप में वापस किया जाता है, न केवल 'एंट्री'। –

6

मैं पुष्टि कर सकता हूं कि मुझे एक ही समस्या है: जब परिणाम के पहले कॉलम में ईएफ द्वारा बनाई गई SQL क्वेरी null है, तो यह इकाई के बजाय शून्य हो जाती है। यह बिल्कुल निम्न अर्थ है:

using (var dc = new MyDbContext()) 
{ 
    var q = dc.Lands; //Lands is DbSet<Land> 
    q = q.Where(criteria); //this leads to SQL query returning null in first column, confirmed by profiler 
    var t = q.Single(); //t is now null 
} 

हम एक और मापदंड है, जो पहले कॉलम में null नहीं होती तो संभव नहीं उठाते, तो t सामान्य गैर null इकाई है।

ऐसा लगता है कि यह ईएफ में किसी प्रकार का अस्पष्ट व्यवहार/बग है।

अद्यतन

मैं व्यवहार निम्नलिखित पाया है जांच के कई घंटे के बाद। ईएफ परिणाम के पहले कॉलम में NULL वाले एंटरसाइट्स के लिए null लौटाता है (जो अपेक्षित व्यवहार को तोड़ता है), लेकिन इसमें कई विचार हैं कि चयन सूची में कॉलम को पहले क्या रखा जाए। इसलिए, मेरे मॉडल को मेरे डेटाबेस स्थिति के साथ सटीक रूप से सुसंगत बनाने के बाद (जिसका अर्थ है NULLABLE डेटाबेस कॉलम और requiredoptional के साथ नेविगेशन गुणों को प्रतिस्थापित करना) - मैं पहले कोड का उपयोग कर रहा हूं, इसलिए डेटाबेस के बारे में स्पष्ट होने के लिए बहुत से स्थान हैं - मैंने इसे काम करने में कामयाब रहा है।

इसका मतलब है कि आपको अपने मॉडल के स्टोर-स्तरीय परिभाषा की जांच करनी चाहिए (आपके द्वारा उपयोग किए जाने वाले प्रतिमान, डिजाइनर-आधारित, या कोड-आधारित, यह अलग-अलग स्थान होंगे) आपके डेटाबेस के विरुद्ध।

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