序列中没有元素?


131

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

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

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

(使用ASP.NET MVC和LINQ)


18
您必须使用SingleOrDefault,如果没有返回任何项目,它将返回null
Mahmoud Farahat

错误是说在dc.BlogPosts中找不到与ID值匹配的任何项目。ID没有值,或者列表中的项目包含该项目。使用SingleOrDefault或FirstOrDefault,如果找不到任何项目(而不是错误),则这些对象将返回空对象。
prd82

Answers:


32

在这两种情况下,都在该行上放置一个断点,或在其之前放置一个Debug.Print,然后查看包含的ID。


2
这样做并发现由于某种原因,ID和日期从编辑页面作为null \ new(0000-0000)传递。该页面的类型为BlogPost。在编辑页面上,我只有标题和内容的文本框,而ID和日期根本没有放在页面上。这可能是将它们传递为null \ new的原因吗?

2
您希望ID来自何处?
Ryan Lundy

8
事后看来,我真的不确定> _ <愚蠢的问题。

367

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

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

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

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

3
这解决了我的问题。感谢您的链接!
2012年

5
完善! ctx.Rosters.First(c => c.RosterAccess == accCode);<-破碎ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<-劳作
拉维·拉姆

2
就我而言,我正在Max做空序列
guzart 2013年

1
因此,现在我们知道,每次投票的重量(目前)为31.25磅。
B. Clay Shannon 2014年

2
您确定LastOrDefault()还会触发该错误吗?为什么呢 我以为“ OrDefault”很重要
Robouste


12

好吧,这是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);

ID是作为参数传递的GUID

10

这样可以解决问题,

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

8

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

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

2

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

例:

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

解决案例:

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

1

错误原因:

  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)

返回具有至少一个元素的序列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.