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


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

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

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

(С помощью ASP.NET MVC и LINQ)

7 97

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();