我目前在两个地方使用单个查询从数据库中获取一行.
BlogPost post = (from p in dc.BlogPosts
where p.BlogPostID == ID
select p).Single();
Run Code Online (Sandbox Code Playgroud)
检索行以将数据放入文本框时查询很好,但是当用于检索行以编辑行并将其重新放回数据库时,它会返回错误"Sequence contains no elements".我无法理解为什么它可能在一个实例中找到合适的行而不是另一个实例.
(使用ASP.NET MVC和LINQ)
小智 335
从" 修复LINQ错误:序列不包含任何元素 ":
当您收到LINQ错误"Sequence contains no elements"时,这通常是因为您使用的是
First()
或Single()
命令而不是FirstOrDefault()
和SingleOrDefault()
.
这也可能由以下命令引起:
FirstAsync()
SingleAsync()
Last()
LastAsync()
Max()
Min()
Average()
Aggregate()
Rya*_*ndy 31
在这两行中放置断点,或在它之前放置一个Debug.Print,并查看ID包含的内容.
Mar*_*ell 12
嗯,这是ID
什么?特别是,它是一个局部变量吗?存在一些范围/捕获问题,这意味着可能需要使用第二个变量副本,仅用于查询:
var id = ID;
BlogPost post = (from p in dc.BlogPosts
where p.BlogPostID == id
select p).Single();
Run Code Online (Sandbox Code Playgroud)
也; 如果这是LINQ-to-SQL,那么在当前版本中,如果使用表单,则会获得稍微好一点的行为:
var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);
Run Code Online (Sandbox Code Playgroud)
Jos*_*les 11
请用
.FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)
因为如果在结果的第一行没有信息,则该指令转到默认信息.
Dig*_*mar 10
这样可以解决问题,
var blogPosts = (from p in dc.BlogPosts
where p.BlogPostID == ID
select p);
if(blogPosts.Any())
{
var post = post.Single();
}
Run Code Online (Sandbox Code Playgroud)
除了已经说过的所有其他内容,您还可以在致电DefaultIfEmpty()
之前先致电Single()
。这将确保您的序列包含某些内容,从而避免InvalidOperationException“序列不包含任何元素”。例如:
BlogPost post = (from p in dc.BlogPosts
where p.BlogPostID == ID
select p).DefaultIfEmpty().Single();
Run Code Online (Sandbox Code Playgroud)
小智 6
我在计算平均值的函数上遇到了类似的情况。
例子:
ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();
Run Code Online (Sandbox Code Playgroud)
已解决的案例:
ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
249250 次 |
最近记录: |