序列不包含元素?

我目前在两个地方使用单个查询来获取数据库中的一行。

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

当检索将数据放入文本框的行时,查询很好,但在用于检索行以编辑并将其放回数据库时,将返回错误“Sequence contains no elements”。 我不明白为什么它会在一个实例中find合适的行,而不是另一个。

(使用ASP.NET MVC和LINQ)

在这一行上放置一个断点,或者在它之前放置一个Debug.Print,在这两种情况下,看看包含了什么ID。

从“ 修复LINQ错误:序列不包含任何元素 ”:

当你得到LINQ错误“Sequence contains no elements”时,通常是因为你使用的是First()Single()命令而不是FirstOrDefault()SingleOrDefault()

这也可能是由以下命令引起的:

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

那么这里的ID是什么? 特别是,它是一个局部variables? 有一些范围/捕获问题,这意味着可能需要使用第二个variables副本,仅用于查询:

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

这将解决问题,

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

请用

 .FirstOrDefault() 

因为如果在结果的行中没有任何信息,该指令就会以info的forms进入行默认值。

错误原因:

  1. from p in dc.BlogPosts where p.BlogPostID == ID select p查询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)

返回至less包含一个元素的序列。