2009-08-24 7 views
83

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

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

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

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

+11

Вы должны использовать SingleOrDefault, он будет возвращать значение null, если не возвращено ни одного элемента. –

ответ

23

Поставьте точку останова на этой линии, или Debug.Print перед ним, в обоих и посмотреть, что содержит идентификатор.

+0

Это и обнаружило, что по какой-либо причине идентификатор и дата передаются как null \ new (0000-0000) со страницы редактирования. Страница строго типизирована как BlogPost. На странице редактирования у меня есть только текстовые поля для заголовка и контента, ID и дата вообще не помещаются на страницу. Может ли это быть причиной того, что они передают их как null \ new? – 2009-08-24 19:43:29

+0

Где вы ожидали получить идентификатор? –

+6

На заднем плане я действительно не уверен> _ <Глупая проблема на самом деле. – 2009-08-24 20:03:55

11

Ну, что такое ID здесь? В частности, это локальная переменная? Есть некоторые вопросы, сфера/захвата, которые означают, что это может быть желательно использовать вторую переменную копию, только для запроса:

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

Также; если это LINQ к SQL, то в текущей версии вы получите немного лучшее поведение, если вы используете форму:

var id = ID; 
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id); 
+0

ID - это идентификатор GUID, переданный как аргумент – 2009-08-24 19:32:09

251

От "Fixing LINQ Error: Sequence contains no elements":

When you get the LINQ Error "Sequence contains no elements", this is usually because you are using the First() or Single() command rather than FirstOrDefault() and SingleOrDefault() .

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

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
+0

Это исправило мою проблему. Спасибо за ссылку! – CountMurphy

+3

Отлично! 'ctx.Rosters.First (c => c.RosterAccess == accCode);' <- broken 'ctx.Rosters.FirstOrDefault (c => c.RosterAccess == accCode);' <- WORKED –

+1

В в моем случае я делал «Макс» над пустой последовательностью – guzart

8

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

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

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

  1. from p in dc.BlogPosts where p.BlogPostID == ID select p Запрос возвращает последовательность.

  2. Single() пытается извлечь элемент из последовательности, возвращаемой на этапе 1.

  3. В соответствии с исключением - Последовательность, возвращаемая на этапе 1, не содержит элементов.

  4. Single() пытается извлечь элемент из последовательности, возвращенной на этапе 1, которая не содержит элементов.

  5. Поскольку Single() не может извлечь один элемент из последовательности, возвращаемой в шаге 1, он выдает ошибку.

Fix:

Убедитесь, что в запросе (from p in dc.BlogPosts where p.BlogPostID == ID select p)

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

4

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

.FirstOrDefault() 

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

Смежные вопросы