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

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

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

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

(используя ASP.NET MVC и LINQ)

7 ответов


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


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

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

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

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
  • Min()

Ну, что такое 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);

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

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

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

.FirstOrDefault()

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


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

  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)

возвращает последовательность по крайней мере с одним элементом.


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

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