Последовательность не содержит элементов? - PullRequest
115 голосов
/ 24 августа 2009

В настоящее время я использую один запрос в двух местах для получения строки из базы данных.

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

Запрос выполняется при извлечении строки для помещения данных в текстовые поля, но возвращает ошибку «Последовательность не содержит элементов», когда используется для извлечения строки с целью ее редактирования и помещения обратно в базу , Я не могу понять, почему он может найти подходящую строку в одном случае, но не в другом.

(с использованием ASP.NET MVC и LINQ)

Ответы [ 8 ]

317 голосов
/ 05 декабря 2011

Из " Исправление ошибки LINQ: последовательность не содержит элементов ":

Когда вы получаете ошибку LINQ «Последовательность не содержит элементов», обычно это происходит потому, что вы используете команду First() или Single() вместо FirstOrDefault() и SingleOrDefault().

Это также может быть вызвано следующими командами:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()
30 голосов
/ 24 августа 2009

Поместите точку останова на эту строку или Debug.Print перед ней в обоих случаях и посмотрите, какой идентификатор содержит.

12 голосов
/ 24 августа 2009

Ну, что здесь 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);
9 голосов
/ 22 июня 2016

Пожалуйста, используйте

.FirstOrDefault()

потому что если в первой строке результата нет информации, эта инструкция переходит к информации по умолчанию.

9 голосов
/ 16 января 2013

Это решит проблему,

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}
4 голосов
/ 24 сентября 2018

В дополнение ко всему, что было сказано, вы можете позвонить DefaultIfEmpty(), прежде чем позвонить Single(). Это гарантирует, что ваша последовательность содержит что-то, и тем самым предотвращает исключение InvalidOperationException «Последовательность не содержит элементов». Например:

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();
1 голос
/ 25 апреля 2019

У меня была похожая ситуация с функцией, которая вычисляет среднее значение.

Пример:

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

Дело решено:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();
1 голос
/ 02 февраля 2016

Причина ошибки:

  1. Запрос from p in dc.BlogPosts where p.BlogPostID == ID select p возвращает последовательность.

  2. Single() пытается извлечь элемент из последовательности, возвращенной на шаге 1.

  3. Согласно исключению - последовательность, возвращаемая на шаге 1, не содержит элементов.

  4. Single () пытается извлечь элемент из последовательности, возвращенной на шаге 1, которая не содержит элементов.

  5. Поскольку Single() не может извлечь ни одного элемента из последовательности, возвращенной на шаге 1, выдается ошибка.

Fix:

Убедитесь, что запрос (from p in dc.BlogPosts where p.BlogPostID == ID select p)

возвращает последовательность хотя бы с одним элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...