Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列不包含元素?_C#_Linq - Fatal编程技术网

C# 序列不包含元素?

C# 序列不包含元素?,c#,linq,C#,Linq,我目前在两个地方使用一个查询从数据库中获取一行 BlogPost post = (from p in dc.BlogPosts where p.BlogPostID == ID select p).Single(); 当检索要将数据放入文本框的行时,查询是正常的,但当用于检索该行以编辑该行并将其放回数据库时,它返回错误“Sequence contains no elements”。我不明白为什么它可能在一个实例中找到合适的行,

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

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();
当检索要将数据放入文本框的行时,查询是正常的,但当用于检索该行以编辑该行并将其放回数据库时,它返回错误“Sequence contains no elements”。我不明白为什么它可能在一个实例中找到合适的行,但在另一个实例中却找不到


(使用ASP.NET MVC和LINQ)

那么,这里的
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错误“序列不包含元素”时,这通常是因为您使用的是
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();
      }
      

      错误原因:

    • 来自dc.BlogPosts中p的查询
      ,其中p.BlogPostID==ID select p
      返回一个序列

    • Single()
      尝试从步骤1中返回的序列中检索元素

    • 根据异常情况-步骤1中返回的序列不包含任何元素

    • Single()尝试从步骤1中返回的不包含元素的序列中检索元素

    • 由于
      Single()

    • 修复:

      确保查询
      (从dc.BlogPosts中的p开始,其中p.BlogPostID==ID选择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();
      

      ID是作为参数传入的GUID。这解决了我的问题。谢谢你的链接!太好了<代码>ctx.Rosters.First(c=>c.RosterAccess==accCode)c.RosterAccess==accCode)
      在我的例子中,我在一个空序列上做了一个
      Max
      ,所以现在我们知道每次向上投票的重量(目前)为31.25磅。你确定
      LastOrDefault()
      也会触发该错误吗?为什么?我认为“OrDefault”是您必须使用SingleOrDefault的所有点,如果没有返回任何项,它将返回null错误是在dc.BlogPosts中找不到任何与ID值匹配的项。ID没有值,或者列表中的项包含该项。使用SingleOrDefault或FirstOrDefault,如果找不到项,则返回空对象,而不是错误;