Последовательность не содержит элементов?
В настоящее время я использую один запрос в двух местах, чтобы получить строку из базы данных.
BlogPost post = (from p in dc.BlogPosts
where p.BlogPostID == ID
select p).Single();
Запрос хорош при извлечении строки для помещения данных в текстовые поля, но он возвращает ошибку "Последовательность не содержит элементов", когда используется для извлечения строки с целью ее редактирования и возврата в базу данных. Я не могу понять, почему он может найти подходящую строку в одном случае, но не в другом.
(С использованием ASP.NET MVC и LINQ)
9 ответов
Поместите точку останова на эту строку или Debug.Print перед ней в обоих случаях и посмотрите, что содержит идентификатор.
Из " Исправления ошибки LINQ: последовательность не содержит элементов":
Когда вы получаете ошибку LINQ "Последовательность не содержит элементов", это обычно происходит потому, что вы используете
First()
или жеSingle()
команда, а неFirstOrDefault()
а такжеSingleOrDefault()
,
Это также может быть вызвано следующими командами:
FirstAsync()
SingleAsync()
Last()
LastOrDefault()
LastAsync()
Max()
Min()
Пожалуйста, используйте
.FirstOrDefault()
потому что если в первой строке результата нет информации, эта инструкция переходит к информации по умолчанию.
В дополнение ко всему, что было сказано, вы можете позвонить DefaultIfEmpty()
прежде чем позвонить Single()
, Это гарантирует, что ваша последовательность содержит что-то и, таким образом, предотвращает исключение InvalidOperationException "Последовательность не содержит элементов". Например:
BlogPost post = (from p in dc.BlogPosts
where p.BlogPostID == ID
select p).DefaultIfEmpty().Single();
Ну что такое 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();
}
У меня была похожая ситуация с функцией, которая вычисляет среднее значение.
Пример:
ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();
Дело решено:
ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();
Причина ошибки:
Запрос
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)
возвращает последовательность с хотя бы одним элементом.
пожалуйста, проверьте строку подключения, возможно, она неверна. Это был мой случай.