2010-10-07 12 views
8

इस उदाहरण कोड मेंLINQ में कोई परिणाम कैसे संभालें?

public Company GetCompanyById(Decimal company_id) 
{ 
    IQueryable<Company> cmps = from c in db.Companies 
           where c.active == true && 
            c.company_id == company_id 
           select c; 
    return cmps.First(); 
} 

मैं कैसे संभाल चाहिए अगर है वहाँ कोई डेटा cmps में?

cmpsअशक्त कभी नहीं होगा, तो मैं एक LINQ क्वेरी में गैर मौजूदा डेटा के लिए कैसे देख सकते हैं?

तो मैं इस

'cmps.ToList()' threw an exception of type ... {System.NullReferenceException} 

जब यह में बदलने उदाहरण के लिए, एक सूची

GetCompanyById(1).ToList(); 

क्या बच सकते हैं मैं हमेशा जरूरत एक try catch ब्लॉक में यह लपेट के लिए?

उत्तर

15

चेक आप Queryable.Any() (या Enumerable.Any()) अगर वहाँ cmps में एक सदस्य है देखने के लिए उपयोग कर सकते हैं। यह आपको स्पष्ट जांच करने देगा, और इसे संभालने के बावजूद इसे संभालेगा।

अपने लक्ष्य को बस वापस जाने के लिए null अगर यहां कोई मिलान नहीं, बस अपनी वापसी बयान में पहले के बजाय FirstOrDefault का उपयोग है:

return cmps.FirstOrDefault(); 
+1

यह वास्तव में स्वीकार्य उत्तर आईएमओ होना चाहिए। –

5

आवेदन करने के बारे में क्या। कोई या .Count()? ?

यहाँ

List<int> numbers = new List<int> { 1, 2 }; 
bool hasElements = numbers.Any(); 
Console.WriteLine("The list {0} empty.", 
        hasElements ? "is not" : "is"); 

या बस का उपयोग एक MSDN

पर उदाहरण है: ऑपरेटर

return myExample.Any() ? myExample.First() : null; 
1

प्रयास करें return cmps.Count()==0?null:cmp.First()

इस तरह अगर यह अशक्त यह बस एक अशक्त कंपनी वापस आ जाएगी और यदि ऐसा नहीं है तो यह सूची में पहला व्यक्ति लौटाएगा।

बाहर http://en.wikipedia.org/wiki/Ternary_operation

+0

आसान सिर्फ FirstOrDefault(), का उपयोग करने के बाद से है कि FirstOrDefault() के व्यवहार है ... इसके अलावा, बेहतर पसंद करते हैं करने के लिए "कोई भी()" "गणना करने के लिए() == 0 ", गणना के बाद से() यदि कई तत्व हैं तो पूर्ण मूल्यांकन लागू करेंगे। –

+0

@ रीड कॉपसी, बस फर्स्टऑर्डफॉल्ट() के बारे में आपका जवाब यह नहीं पता था कि यह क्या हुआ, निश्चित रूप से उपयोगी है। आपका जवाब सही है। +1 – Gage

2

यह पहले एक वापस आ जाएगी अगर वहाँ है अथवा यदि रिक्त है वहाँ नहीं है:

return (from c in db.Companies 
where c.active == true && 
c.company_id == company_id 
select c).FirstOrDefault(); 
0
 var context = new AdventureWorksLT2008Entities(); 
     var cust = context.Customers.Where(c => c.CustomerID == 1); 
     if (cust.Any()) 
     { 
      Customer c = cust.First(); 
     } 
संबंधित मुद्दे