序列不包含任何元素?

121 c# linq

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

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();
Run Code Online (Sandbox Code Playgroud)

检索行以将数据放入文本框时查询很好,但是当用于检索行以编辑行并将其重新放回数据库时,它会返回错误"Sequence contains no elements".我无法理解为什么它可能在一个实例中找到合适的行而不是另一个实例.

(使用ASP.NET MVC和LINQ)

小智 335

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

当您收到LINQ错误"Sequence contains no elements"时,这通常是因为您使用的是First()Single()命令而不是FirstOrDefault()SingleOrDefault().

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

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

  • 完善!`ctx.Rosters.First(c => c.RosterAccess == accCode);`< - broken`ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);`< - WORKED (4认同)
  • 有时,如果您不希望集合为空,则最好使用不带默认值的 Single() 或 First() 。否则错误可能会被忽视。 (4认同)
  • 这解决了我的问题。感谢您的链接! (2认同)
  • 就我而言,我在一个空序列上做一个“ Max” (2认同)
  • 您确定`LastOrDefault()`也可以触发该错误吗?为什么呢 我以为“ OrDefault”很重要 (2认同)

Rya*_*ndy 31

在这两行中放置断点,或在它之前放置一个Debug.Print,并查看ID包含的内容.

  • 在后面的视线中,我真的不确定> _ <傻问题真的. (8认同)
  • 这样做并发现由于某种原因,ID和日期从编辑页面作为null \ new(0000-0000)传递。该页面的类型为BlogPost。在编辑页面上,我只有标题和内容的文本框,而ID和日期根本没有放在页面上。这可能是将它们传递为null \ new的原因吗? (2认同)
  • 您希望ID来自何处? (2认同)

Mar*_*ell 12

嗯,这是ID什么?特别是,它是一个局部变量吗?存在一些范围/捕获问题,这意味着可能需要使用第二个变量副本,仅用于查询:

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();
Run Code Online (Sandbox Code Playgroud)

也; 如果这是LINQ-to-SQL,那么在当前版本中,如果使用表单,则会获得稍微好一点的行为:

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);
Run Code Online (Sandbox Code Playgroud)


Jos*_*les 11

请用

.FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

因为如果在结果的第一行没有信息,则该指令转到默认信息.

  • 如果是异步调用,请使用.FirstOrDefaultAsync();。 (2认同)

Dig*_*mar 10

这样可以解决问题,

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


bry*_*k3y 6

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

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

例子:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();
Run Code Online (Sandbox Code Playgroud)

已解决的案例:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();
Run Code Online (Sandbox Code Playgroud)