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