【问题标题】:Sequence contains no elements?序列不包含元素?
【发布时间】:2021-02-19 16:43:44
【问题描述】:

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

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

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

(使用 ASP.NET MVC 和 LINQ)

【问题讨论】:

  • 你必须使用 SingleOrDefault ,如果没有返回任何项目,它将返回 null
  • 错误是在 dc.BlogPosts 中找不到任何与 ID 值匹配的项目。要么 ID 没有值,要么列表中的项目包含该项目。使用 SingleOrDefault 或 FirstOrDefault,如果没有找到项目而不是错误,这些将返回一个空对象。

标签: c# linq


【解决方案1】:

那么,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
【解决方案2】:

来自“Fixing LINQ Error: Sequence contains no elements”:

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

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

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

【讨论】:

  • 这解决了我的问题。感谢您的链接!
  • 完美! ctx.Rosters.First(c => c.RosterAccess == accCode); ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);
  • 在我的情况下,我在一个空序列上执行Max
  • 所以现在我们知道每张赞成票(目前)重 31.25 磅。
  • 您确定LastOrDefault() 也可以触发该错误吗?为什么 ?我认为“OrDefault”才是重点
【解决方案3】:

这样就可以解决问题了,

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

【讨论】:

【解决方案4】:

错误原因:

  1. 查询from p in dc.BlogPosts where p.BlogPostID == ID select p返回一个序列。

  2. Single() 尝试从第 1 步返回的序列中检索一个元素。

  3. 根据异常 - step1 中返回的序列不包含任何元素。

  4. Single() 尝试从第 1 步返回的序列中检索不包含任何元素的元素。

  5. 由于Single() 无法从第1 步返回的序列中获取单个元素,因此会引发错误。

修复:

确保查询(from p in dc.BlogPosts where p.BlogPostID == ID select p)

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

【讨论】:

    【解决方案5】:

    请使用

    .FirstOrDefault()
    

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

    【讨论】:

    • 在异步调用的情况下使用 .FirstOrDefaultAsync();
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

      例子:

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

      已解决的案例:

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

      【讨论】:

        【解决方案8】:

        请检查您的连接字符串,可能是错误的。这是我的情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-04
          • 2017-11-21
          • 1970-01-01
          • 1970-01-01
          • 2014-05-23
          • 2015-02-19
          相关资源
          最近更新 更多