目前,我在两个地方使用单个查询从数据库中获取一行。
BlogPost post = (from p in dc.BlogPosts where p.BlogPostID == ID select p).Single();
当检索该行以将数据放入文本框时,查询是可以的,但是当用于检索该行以编辑它并将其放回数据库时,它返回一个错误“序列不包含任何元素”。我不明白为什么它可以在一个实例中找到合适的行,而在另一个实例中却找不到。
(使用 ASP.NET MVC 和 LINQ)
这里的 ID是什么?特别是,它是一个局部变量吗?存在一些范围/捕获问题,这意味着可能需要为查询使用第二个变量副本:
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 错误: 序列不包含任何元素》 :
当您得到 LINQ 错误“序列不包含任何元素”时,这通常是因为您使用的是 First()或 Single()命令,而不是 FirstOrDefault()和 SingleOrDefault()。
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(); }
错误原因:
查询 from p in dc.BlogPosts where p.BlogPostID == ID select p返回一个序列。
from p in dc.BlogPosts where p.BlogPostID == ID select p
Single()尝试从步骤1中返回的序列中检索元素。
根据异常 -第1步中返回的序列不包含任何元素。
Single ()尝试从步骤1中返回的不包含任何元素的序列中检索元素。
由于 Single()无法从步骤1中返回的序列中提取单个元素,因此抛出一个错误。
解决方案:
确保查询 (from p in dc.BlogPosts where p.BlogPostID == ID select p)
(from p in dc.BlogPosts where p.BlogPostID == ID select p)
返回至少包含一个元素的序列。
请用
.FirstOrDefault()
因为如果在结果的第一行没有信息,那么这条指令就会转到默认信息。
除了已经说过的所有内容之外,您还可以在调用 Single()之前调用 DefaultIfEmpty()。这将确保您的序列包含某些内容,从而避免“序列不包含任何元素”的 InvalidOperationException。例如:
DefaultIfEmpty()
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();
请检查一下你的连接线,可能是错的。这是我的案子。