2012-01-16 8 views
8

मैं निम्नलिखित LINQ प्रश्न हैं:Linq FirstOrDefault

Manager mngr = (from tr in DataContext.Manager 
        where tr.Name = "Jones").FirstOrDefault(); 

मैं कैसे जांच कर सकते हैं, बशर्ते क्वेरी 1 रिकॉर्ड वापस किया मैं .Count ऐसा नहीं कर सकते क्योंकि संख्या प्राप्त करने के लिए।

+3

फर्स्टऑर्डडिल्ट विधि के लिए दस्तावेज़ देखें। यदि कोई परिणाम नहीं है तो यह डेटा प्रकार के लिए डिफ़ॉल्ट देता है। यदि यह जरूरी है कि * 1 से अधिक * रिकॉर्ड क्वेरी मानदंड पास नहीं करता है, तो इसके बजाय सिंगलऑर्डडिल्ट का उपयोग करें। –

उत्तर

14

सबसे पहले, यह एक वैध क्वेरी नहीं है। जब आप क्वेरी सिंटैक्स (from blah in blah ...) का उपयोग करते हैं, तो आपके पास select क्लॉज होना चाहिए। इसे और अधिक की तरह होना चाहिए:

var manager = 
    (from n in DataContext.Manager 
    where n.Name == "Jones" 
    select n).FirstOrDefault(); 

आपके प्रश्न का उत्तर करने के लिए, आपकी क्वेरी पर FirstOrDefault() बुला क्वेरी या प्रकार के लिए डिफ़ॉल्ट मान (सबसे अधिक संभावना null इस मामले में) के पहले परिणाम वापस आ जाएगी। आप जो भी जा रहे हैं, उसके लिए यह पर्याप्त उपयोग नहीं होगा क्योंकि क्वेरी में एक से अधिक परिणाम हो सकते हैं।

यदि आप यह सत्यापित करना चाहते हैं कि क्वेरी केवल एक परिणाम देता है, तो आपको इसके बजाय SingleOrDefault() विधि का उपयोग करना चाहिए। यह क्वेरी द्वारा उत्पादित एक आइटम को वापस कर देगा, डिफ़ॉल्ट मान null यदि यह खाली था या एक से अधिक आइटम होने पर अपवाद फेंक देगा।

यदि आप कोई अपवाद नहीं फेंकना चाहते हैं, तो पहले दो परिणामों को एक सूची में फेंकना और यह सत्यापित करना आसान हो सकता है कि आपके पास केवल एक है।

var managers = 
    (from m in DataContext.Manager 
    where m.Name == "Jones" 
    select m).Take(2).ToList(); 
if (managers.Count == 1) 
{ 
    // success! 
    var manager = managers.First(); 
    // do something with manager 
} 
else 
{ 
    // error 
} 
+0

जिस तरह से मैंने यह किया था, यह कहना था कि अगर (mngr! = Null) {.. हम जानते हैं कि हमें लीज 1 रिकॉर्ड} –

+0

पर मिला है। एक है। सिंगल() जो जांचता है कि आपके पास ** बिल्कुल ** एक रिकॉर्ड – PPC

+0

है - 1 सुझाव देने के लिए कि परिणामों को एक सूची में फेंकना और गिनती एक पर्याप्त समाधान होगा। बड़े परिणाम सेट पर ऐसा करना या जहां सभी डेटा को पकड़ने के लिए एक बड़ी मेज को पार किया जाना चाहिए, वह बहुत खराब होगा। प्रथम और एकल दोनों बैकएंड अनुकूलन जिन्हें आपके सुझाव के साथ दोहराया नहीं जा सकता है। –

0

आप SingleOrDefault विस्तार विधि का उपयोग यह व्यक्त करने के लिए कर सकते हैं कि क्वेरी को केवल एक परिणाम लौटा देना चाहिए।

Manager manager = (from tr in DataContext.Manager 
        where tr.ID = "2323").SingleOrDefault(); 

हालांकि यह आपको बता नहीं पड़ता कि आप मिल गया 0 परिणाम या एक से अधिक 1.

0

आप, रिकॉर्ड की संख्या के बिना FirstOrDefault क्वेरी का परिणाम गिनती करने के लिए चाहते हैं।

var mngr = (from tr in DataContext.Manager 
       where tr.ID = "2323") 
if(mngr.Count() == 0) 
    .... 
else 
    Manager manager = mngr.First(); //No need for default since we know we have a record. 

आप अभी भी विशिष्ट प्रबंधक प्राप्त करने के लिए mngr पर पहले या डिफ़ॉल्ट चला सकते हैं।

0

आप where स्थिति के लिए एक आईडी का उपयोग कर रहे हैं, मुझे लगता है कि आपको पहले ही गारंटी होनी चाहिए कि यह क्वेरी केवल एक परिणाम देता है।

यदि आपकी समस्या का कोई परिणाम नहीं है तो कृपया MSDN title से उपयोग की जांच करें।

  int[] numbers = { }; 
      int first = numbers.FirstOrDefault(); 
      Console.WriteLine(first); 

      /* 
      This code produces the following output: 

      0 
      */