linq 序列不包含元素?

yxyvkwin  于 2023-01-03  发布在  其他
关注(0)|答案(7)|浏览(270)

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

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

当检索行以将数据放入文本框时,该查询很好,但当用于检索行以编辑它并将其放回数据库时,它返回错误“Sequence contains no elements”。我不明白为什么它可能在一个示例中找到合适的行,但在另一个示例中找不到。
(使用ASP.NET MVC和LINQ)

icomxhvb

icomxhvb1#

从“Fixing LINQ Error: Sequence contains no elements“开始:
当您收到LINQ错误“序列不包含元素”时,这通常是因为您使用的是First()Single()命令,而不是FirstOrDefault()SingleOrDefault()
这也可能是由以下命令引起的:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • x1米11米1x
2ledvvac

2ledvvac2#

请使用

.FirstOrDefault()

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

8ulbf1ek

8ulbf1ek3#

那么,这里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);
mfuanj7w

mfuanj7w4#

除了前面提到的所有内容之外,您还可以在调用Single()之前调用DefaultIfEmpty()。这将确保您的序列包含一些内容,从而避免InvalidOperationException“Sequence contains no elements”。例如:

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

t8e9dugd5#

这将解决问题,

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

mpbci0fu6#

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

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

案件解决日期:

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

rseugnpd7#

错误原因:

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

  1. Single()尝试从步骤1返回的序列中检索元素。
    1.根据异常-步骤1中返回的序列不包含元素。
  2. Single()尝试从步骤1返回的序列中检索一个不包含任何元素的元素。
    1.由于Single()无法从步骤1返回的序列中获取单个元素,因此它抛出错误。

修复:

确保查询(from p in dc.BlogPosts where p.BlogPostID == ID select p)
返回至少包含一个元素的序列。

相关问题