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();
}
错误原因:
,其中p.BlogPostID==ID select p
返回一个序列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,如果找不到项,则返回空对象,而不是错误;