Послідовність не містить елементів?


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, вони повернуть нульовий об'єкт, якщо жодного елемента не буде знайдено, а не помилка.
prd82

Відповіді:


32

Поставте точку перерви на цій лінії або Debug.Print перед нею в обох випадках і подивіться, що містить ідентифікатор.


2
Зробив це і виявив, що чомусь ідентифікатор та дата передаються як нульові \ нові (0000-0000) зі сторінки редагування. Сторінка сильно набрана як BlogPost. На сторінці редагування у мене є лише текстові поля для заголовка та вмісту, ідентифікатор та дата взагалі не розміщуються на сторінці. Чи може це бути причиною того, що вони передають їх як null \ new?

2
Звідки ви очікували приходу посвідчення особи?
Райан Лунді

8
Заднім поглядом я дійсно не впевнений> _ <Дурне завдання насправді.

367

З " Виправлення помилки LINQ: Послідовність не містить елементів ":

Коли ви отримуєте помилку LINQ "Послідовність не містить елементів", це зазвичай тому, що ви використовуєте команду First()або, Single()а не FirstOrDefault()та SingleOrDefault().

Це також може бути викликано такими командами:

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

3
Це вирішило мою проблему. Дякуємо за посилання!
CountMurphy

5
Ідеально! ctx.Rosters.First(c => c.RosterAccess == accCode);<- зламаний ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- РОБОТИ
Раві Рам

2
У моєму випадку я робив Maxнад порожньою послідовністю
гузарт

1
Тож тепер ми знаємо, що кожен голос на виборах важить (на даний момент) 31,25 фунта.
Б. Клей Шеннон

2
Ви впевнені, що LastOrDefault()це також може викликати цю помилку? Чому? Я подумав, що "OrDefault" був суть
Robouste

22

Будь ласка, використовуйте

.FirstOrDefault()

тому що якщо в першому рядку результату немає інформації, ця інструкція переходить до інформації за замовчуванням.


2
У разі виклику асинхронізації використовуйте .FirstOrDefaultAsync ();
Андреа Гірарді

12

Ну, що IDтут? Зокрема, це локальна змінна? Існують деякі проблеми сфери / захоплення, які означають, що може бути бажаним використовувати другу копію змінної, лише для запиту:

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

Також; якщо це LINQ-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. Single () намагається отримати елемент із послідовності, повернутої на кроці 1, яка не містить елементів.

  5. Оскільки Single()не в змозі отримати жоден елемент із послідовності, повернутої на кроці1, він видає помилку.

Виправити:

Переконайтесь, що запит (from p in dc.BlogPosts where p.BlogPostID == ID select p)

повертає послідовність щонайменше з одним елементом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.