序列不包含元素?
我目前在两个地方使用单个查询来获取数据库中的一行。
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进入行默认值。
错误原因:
-
from p in dc.BlogPosts where p.BlogPostID == ID select p
查询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)
返回至less包含一个元素的序列。