अनुक्रम में कोई तत्व शामिल नहीं है?


131

मैं वर्तमान में एक डेटाबेस से एक पंक्ति प्राप्त करने के लिए दो स्थानों में एक ही क्वेरी का उपयोग कर रहा हूं।

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();

पाठ बॉक्सों में डेटा डालने के लिए पंक्ति को पुनर्प्राप्त करते समय क्वेरी ठीक है, लेकिन यह एक त्रुटि "अनुक्रम में कोई तत्व नहीं है" देता है जब इसे संपादित करने और डेटाबेस में वापस डालने के लिए पंक्ति को पुनः प्राप्त करने के लिए उपयोग किया जाता है। मुझे समझ नहीं आ रहा है कि एक उदाहरण में एक उपयुक्त पंक्ति क्यों मिल सकती है लेकिन दूसरी नहीं।

(ASP.NET MVC और LINQ का उपयोग करके)


18
आपको SingleOrDefault का उपयोग करना होगा, यदि कोई आइटम नहीं लौटा तो यह अशक्त हो जाएगा
महमूद फ़रहत

त्रुटि यह कह रही है कि यह dc.BlogPosts में किसी भी आइटम को नहीं खोज सकता है जो आईडी के मूल्य से मेल खाता है। या तो आईडी का कोई मूल्य नहीं है या आपकी सूची के आइटम में वह आइटम नहीं है। SingleOrDefault या FirstOrDefault का उपयोग करें, ये एक अशक्त वस्तु को वापस कर देंगे यदि कोई आइटम नहीं मिला है तो त्रुटि के बजाय।
प्रादा 9२

जवाबों:


32

उस स्थिति में एक विराम बिंदु, या डीबग करें। इससे पहले, दोनों मामलों में और देखें कि आईडी में क्या है।


2
क्या उसने पाया और किसी कारण से, आईडी और दिनांक को संपादित पृष्ठ से null \ new (0000-0000) के रूप में पारित किया जा रहा है। पृष्ठ को BlogPost के रूप में दृढ़ता से टाइप किया गया है। संपादन पृष्ठ पर, मेरे पास केवल शीर्षक और सामग्री के लिए पाठ बॉक्स हैं, आईडी और दिनांक पृष्ठ पर बिल्कुल भी नहीं डाले गए हैं। क्या यह उन्हें शून्य \ n के रूप में पारित करने का कारण हो सकता है?

2
आप कहां से आने के लिए आईडी की उम्मीद कर रहे थे?
रेयान लुंडी

8
हिंद दृष्टि में, मुझे वास्तव में यकीन नहीं है कि _ _ <मूर्खतापूर्ण समस्या।

367

" फिक्सिंग LINQ त्रुटि: अनुक्रम में कोई तत्व नहीं हैं ":

जब आप LINQ त्रुटि मिलती है, "अनुक्रम कोई तत्व शामिल हैं" यह आमतौर पर है, क्योंकि आप उपयोग कर रहे हैं First()या Single()करने के बजाय आदेश FirstOrDefault()और SingleOrDefault()

यह निम्न आदेशों के कारण भी हो सकता है:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

3
इससे मेरी समस्या ठीक हो गई। लिंक के लिए धन्यवाद!
काउंटमर्फी

5
उत्तम! ctx.Rosters.First(c => c.RosterAccess == accCode);<- टूट ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- WORKED
रवि राम

2
मेरे मामले में मैं Maxएक खाली अनुक्रम कर रहा था
२३'१३ गज़ार्ट

1
तो अब हम जानते हैं कि प्रत्येक वोट का वजन (फिलहाल) 31.25 पाउंड है।
बी क्ले शैनन

2
क्या आप सुनिश्चित हैं कि LastOrDefault()उस त्रुटि को भी ट्रिगर कर सकते हैं? क्यों ? मैं सभी बिंदु सोचा था कि "OrDefault" था
Robouste

22

इस्तेमाल करें

.FirstOrDefault()

क्योंकि अगर परिणाम की पहली पंक्ति में कोई जानकारी नहीं है तो यह निर्देश डिफ़ॉल्ट जानकारी पर जाता है।


2
Async कॉल के उपयोग के मामले में .irstOrDefaultAsync ();
एंड्रिया गिरार्डी

12

खैर, IDयहाँ क्या है ? विशेष रूप से, यह एक स्थानीय चर है? कुछ स्कोप / कैप्चर मुद्दे हैं, जिसका मतलब है कि क्वेरी के लिए, दूसरी वैरिएबल कॉपी का उपयोग करना वांछनीय हो सकता है:

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();

इसके अलावा, यदि यह LINQ-to-SQL है, तो वर्तमान संस्करण में यदि आप फ़ॉर्म का उपयोग करते हैं तो आपको थोड़ा बेहतर व्यवहार मिलेगा:

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);

आईडी एक GUID है जिसे एक तर्क के रूप में पारित किया गया है

10

इससे समस्या का समाधान हो जाएगा,

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}

8

कहा गया है कि सब कुछ के अलावा, आप कॉल करने DefaultIfEmpty()से पहले कॉल कर सकते हैं Single()। यह सुनिश्चित करेगा कि आपके अनुक्रम में कुछ है और जिससे InvalidOperationException "अनुक्रम में कोई तत्व नहीं है" हो जाता है। उदाहरण के लिए:

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();

2

मेरे पास एक फ़ंक्शन पर एक समान स्थिति थी जो औसत की गणना करती है।

उदाहरण:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

केस हल हो गया:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

1

त्रुटि का कारण:

  1. क्वेरी from p in dc.BlogPosts where p.BlogPostID == ID select pएक अनुक्रम देता है।

  2. Single() चरण 1 में दिए गए अनुक्रम से एक तत्व को पुनः प्राप्त करने की कोशिश करता है।

  3. अपवाद के अनुसार - चरण 1 में दिए गए अनुक्रम में कोई तत्व नहीं हैं।

  4. सिंगल () चरण 1 में दिए गए अनुक्रम से एक तत्व को पुनः प्राप्त करने की कोशिश करता है जिसमें कोई तत्व नहीं होता है।

  5. चूंकि Single()चरण 1 में लौटे अनुक्रम से एक भी तत्व लाने में सक्षम नहीं है, यह एक त्रुटि फेंकता है।

ठीक कर:

क्वेरी ज़रूर करें (from p in dc.BlogPosts where p.BlogPostID == ID select p)

कम से कम एक तत्व के साथ एक अनुक्रम देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.