2010-01-20 18 views
8

मुझे एक linq क्वेरी के साथ समस्या हो रही है। मैंने पहले इसी तरह इसका इस्तेमाल किया है लेकिन मुझे समझ में नहीं आता कि अब क्या गलत हो सकता है।linq क्वेरी जहां int ID सूची <int>

त्रुटियाँ

सबसे अच्छा अतिभारित विधि मैच 'System.Collections.Generic.List.Contains (int)' के लिए कुछ अमान्य तर्क
तर्क '1' है: 'से परिवर्तित नहीं कर सकते int? ' 'int' करने के लिए; rTestResults की जहां खंड को संदर्भित करता है

कोड:

List<int> rMTCPlates = (from rP in mDataContext.Plates 
         where rP.SOItem.SONumberID == aSONumber 
         select rP.ID).ToList(); 

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where rMTCPlates.Contains(rT.PlateID) 
        select rT; 

किसी भी विचार क्या हो रहा?

किसी भी मदद की सराहना की है,
धन्यवाद

उत्तर

21

आप null-coalescing operator यहाँ का उपयोग कर सकते हैं:

var rTestResults = from rT in mDataContext.TestSamplesViews 
       where rMTCPlates.Contains(rT.PlateID ?? 0) 
       select rT; 
+0

तुम भी rT.PlateID इस्तेमाल कर सकते हैं .GetValueOrDefault(), जो आपके प्रकार के लिए डिफ़ॉल्ट मान जो भी शून्य है, का उपयोग करेगा। – JonC

+0

+1 मुझे आज कुछ नया सिखाने के लिए +1 ... बस इसका इस्तेमाल किया :) – Modika

6

ऐसा इसलिए है क्योंकि ID फ़ील्ड, नल है, जबकि संग्रह में आइटम नहीं हैं।

शायद आप डेटाबेस में नॉन-नल के रूप में इसे चिह्नित करना भूल गए हैं, इसलिए डिजाइनर ने इसे इस तरह से उत्पन्न किया।

डीबी में सबसे अच्छी बात चिह्न शून्य नहीं है और डेटा रीफ्रेश नहीं है।

इसके अलावा, यू जो LINQ आप उपयोग कर रहे निर्दिष्ट नहीं किया, आप डीबी linq संभालने, मुझे यकीन है कि नहीं कर रहा हूँ शामिल विस्तार विधि संस्थाओं को Sql या Linq करने के लिए Linq में काम करता है, तो आप आप के बाद भी एक और NotSupportedException मिल सकता है उपरोक्त को ठीक करें।

इसलिए, या तो दो प्रश्नों का उपयोग करें, डीबी तक पहुंचने वाला पहला और दूसरा लोड लोड संग्रह से आपको मूल्य पुनर्प्राप्त करने के लिए, या 'Contains()' workaround using Linq to Entities? का उपयोग करने पर विचार करें।

और तुम LINQ-वस्तुओं का उपयोग कर रहे हैं और आप के बारे में परवाह नहीं है सब कचरा ऊपर कहा कि अगर, बस नीचे दिए का उपयोग करें:

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where rT.PlateID.HasValue && 
         rMTCPlates.Contains(rT.PlateID.Value) 
        select rT.Value; 
2

System.Collections.Generic.List.Contains(int) पर अपवाद के बाद से मुझे लगता है कि mDataContext.TestSamplesViews.PlateID शून्य है।

तुम सिर्फ एक easyquick ठीक करना चाहते हैं, और/या आप नहीं कर सकते PlateID को बदलते हैं तो यह अब और नल नहीं है, आप देख सकते हैं कि यह पहली बार एक मूल्य है:

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where (rT.PlateID.HasValue && rMTCPlates.Contains(rT.PlateID)) 
        select rT; 
संबंधित मुद्दे