Последовательность не содержит элементов?

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

Ну, что здесь 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);

Ответ 4

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

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

Ответ 5

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

.FirstOrDefault()

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

Ответ 6

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

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

Ответ 7

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

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

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

  • В соответствии с исключением. Последовательность, возвращаемая на этапе 1, не содержит элементов.

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

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

Fix:

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

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

Ответ 8

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

Пример:

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

Дело решено:

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