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


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.