2013-04-11 13 views
8
recordsList.ListOfRecords = new StudentRecordsBAL() 
           .GetStudentsList() 
           .Select(q => new StudentRecords() 
      { 
       _RollNumber = q._RollNumber, 
       _Class = q._Class, 
       _Name = q._Name, 
       _Address = q._Address, 
       _City = q._City, 
       _State = q._State, 
       _Subjects = q._Subject, 
       _AttendedDays = new AttendanceBAL() 
            .GetAttendanceListOf(q._RollNumber) 
            .Where(date => date != null) 
            .Select(date => 
             new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) 
            .Distinct() 
            .ToList(), 
       _AttendedSubjects = GetAttendedSubjects(q._RollNumber)            
     }).ToList(); 

विधि, GetAttendanceListOf(q._RollNumber) उपरोक्त कोड में अगर वहाँ से पारित कर दिया "रोल-नहीं" के लिए वर्तमान कोई रिकॉर्ड कर रहे हैं डेटाबेस या "अशक्त" से रिकॉर्ड की एक सूची प्रदान करेगा। एक linq क्वेरी को उत्पन्न करने में त्रुटिlinq में शून्य मानों को कैसे संभालें?

"मान शून्य नहीं हो सकता"।

क्या इस त्रुटि को संभालने और LINQ कूद को अगले चरण में लाने का कोई तरीका है?

+0

शायद आप नल को फ़िल्टर करने के लिए 'कहां (q => q! = Null) 'का उपयोग कर सकते हैं? –

+0

या, यह "चीजों की सूची या शून्य" है, आप कुछ चुन सकते हैं जैसे 'चयन (एल => एल == नल? Iterable.Empty: l) ' –

+0

यदि आप कर सकते हैं, तो बस खाली करने के लिए' GetAttendanceListOf' को संशोधित करें अगर दिया गया 'रोल-नो' के लिए कुछ भी नहीं मिला है तो सूची। – pfyod

उत्तर

10
_AttendedDays = new AttendanceBAL() 
    .GetAttendanceListOf(q._RollNumber) 
    .Where(date => date != null) 
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) 
    .Distinct() 
    .ToList(), 

समस्या शून्य उदाहरण पर Where() चलाने के साथ है। संभावित समाधान:

1) GetAttendanceListOf संशोधित एक खाली सूची वापस करने के लिए करता है, तो कोई भी प्रत्यक्ष (सामान्य रूप में अच्छा विचार है, null object pattern के रूप में अक्सर एक जीवन रक्षक है, और संग्रह के लिए, एक खाली संग्रह अक्सर शून्य पर शब्दार्थ समान है)
2) यदि आप उस विधि को नियंत्रित नहीं करते हैं, तो एक सुरक्षित एक्सटेंशन विधि लिखें जो शून्य के मामले में खाली सूची लौटाएगी, उदाहरण के लिए

List<AttendanceType> SafeAttendanceList(this AttendanceBALType bal, RollNumber rn) 
{ 
    return bal.GetAttendanceListOf(rn) ?? new List<AttendanceType>(); 
} 

तब के रूप में यह कहते हैं:

_AttendedDays = new AttendanceBAL() 
    .SafeAttendanceListOf(q._RollNumber) 
    .Where(date => date != null) 
+0

यह विस्तार विधि योजना मेरे लिए काम नहीं करती है, उसने 2 तर्कों की मांग की। लेकिन विचार के लिए धन्यवाद। मैंने इसे किसी अन्य तरीके से कार्यान्वित किया और मेरी समस्या हल हो गई। –

+1

सुनिश्चित नहीं है कि मैं सही ढंग से समझ गया हूं, लेकिन पहला तर्क 'यह उपस्थिति बाल बाल' है, इसलिए आप इसे अभी भी कहते हैं जैसे कि इसमें 1 तर्क है: 'bal..GetAttendanceListOf (q._RollNumber) '। विस्तार विधियों का पूरा बिंदु –

0

Linq ToList() एक खाली सूची वापस आ जाएगी अगर कोई परिणाम नहीं हैं। त्रुटि कहीं और से आ सकती है।

मैं आपको अपनी वस्तुओं को बनाने के तरीकों का उपयोग करने की सिफारिश करता हूं, यह आपकी क्वेरी को पढ़ने और डीबग करने में आसान बना देगा। मैं अनुशंसा करता हूं कि आप यह निर्धारित करने के लिए कई चरणों में ऐसा करें कि शून्य क्या हो रहा है और वास्तव में यह निष्पादित करने में विफल रहता है।

त्रुटि हो सकता है GetAttendanceListOf से आता है(), जब IList या IEnumerable लौटने तरीकों होने, आप एक खाली सूची है, अगर वहाँ कोई परिणाम नहीं लौटना चाहिए, अगर यह शून्य है या नहीं यह हर समय सत्यापित करने से रोकेगा।

0

आप

recordsList.ListOfRecords = new StudentRecordsBAL().GetStudentsList().Select(q => 
      { 
       var attendanceList = new AttendanceBAL().GetAttendanceListOf(q._RollNumber); 
       if (attendanceList == null) 
        return null; 
       return new StudentRecords() 
        { 
         _RollNumber = q._RollNumber, 
         _Class = q._Class, 
         _Name = q._Name, 
         _Address = q._Address, 
         _City = q._City, 
         _State = q._State, 
         _Subjects = q._Subject, 
         _AttendedDays = attendanceList.Where(date => date != null).Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)).Distinct().ToList(), 
         _AttendedSubjects = GetAttendedSubjects(q._RollNumber) 
        }; 
      }).Where(q => q != null).ToList(); 

कोशिश कर सकते हैं यह जाँच करता है कि आप एक अशक्त वस्तु पर एक Where आपरेशन करते हैं और किसी भी अशक्त परिणाम को फ़िल्टर नहीं करतीं।

0

@Zdeslav Vojkovic द्वारा सुझाव दिया गया है GetAttendanceListOf अगर शून्य खाली सूची वापसी या की तरह कुछ करने के लिए संशोधित:

 
_AttendedDays = (new AttendanceBAL() 
    .GetAttendanceListOf(q._RollNumber) ?? Enumerator.Empty<typeofrecord>()) 
    .Where(date => date != null) 
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) 
    .Distinct() 
    .ToList(), 

0

एक त्वरित के लिए (आप अतिरिक्त कोष्टक के बिना यह करने के लिए सक्षम हो सकता है) , ठीक इस लाइन

_AttendedDays = नए AttendanceBAL()। GetAttendanceListOf (q._RollNumber) .Where संशोधित करें ...

इस

_AttendedDays = (नई AttendanceBAL()। GetAttendanceListOf (q._RollNumber) ?? नई सूची()) .Where करने के लिए

...

+0

एली अल्ग्रांति के समाधान के साथ जाता है। अधिक सुरुचिपूर्ण लगता है .. –

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