Последовательность не содержит элементов?
в настоящее время я использую один запрос в двух местах, чтобы получить строку из базы данных.
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()
потому что, если в первой строке результата нет информации, эта инструкция переходит к информации по умолчанию.
причина ошибки:
запрос
from p in dc.BlogPosts where p.BlogPostID == ID select p
возвращает последовательность.Single()
пытается извлечь элемент из последовательности, возвращенной на шаге 1.за исключением - последовательность, возвращаемая на шаге 1, не содержит элементов.
Single () пытается получить элемент из последовательности, возвращенной на шаге 1, который не содержит элементы.
С
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();