序列中没有元素?

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

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

当检索该行以将数据放入文本框时,查询是可以的,但是当用于检索该行以编辑它并将其放回数据库时,它返回一个错误“序列不包含任何元素”。我不明白为什么它可以在一个实例中找到合适的行,而在另一个实例中却找不到。

(使用 ASP.NET MVC 和 LINQ)

437224 次浏览

这里的 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);

来自《 修正 LINQ 错误: 序列不包含任何元素》 :

当您得到 LINQ 错误“序列不包含任何元素”时,这通常是因为您使用的是 First()Single()命令,而不是 FirstOrDefault()SingleOrDefault()

这也可能是由以下命令造成的:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

这样问题就解决了,

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

错误原因:

  1. 查询 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)

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

请用

.FirstOrDefault()

因为如果在结果的第一行没有信息,那么这条指令就会转到默认信息。

除了已经说过的所有内容之外,您还可以在调用 Single()之前调用 DefaultIfEmpty()。这将确保您的序列包含某些内容,从而避免“序列不包含任何元素”的 InvalidOperationException。例如:

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

我在一个计算平均值的函数上也遇到过类似的情况。

例如:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

案件解决:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

请检查一下你的连接线,可能是错的。这是我的案子。