C# 假;序列不包含任何元素”;使用Single()时出现异常

C# 假;序列不包含任何元素”;使用Single()时出现异常,c#,linq,asp.net-mvc-4,C#,Linq,Asp.net Mvc 4,在Linq语句中使用.Single()时,我似乎遇到了错误异常引发的问题。检查调试器时,我发现我的列表中确实包含我要查找的元素,并且id字段匹配。引发异常的代码是 public ActionResult Details(int id = 0) { FilterQueue filterqueue = db.FilterQueues.Single(f => f.FilterQueueId == id); if (filterqueue == null) {

在Linq语句中使用
.Single()
时,我似乎遇到了错误异常引发的问题。检查调试器时,我发现我的列表中确实包含我要查找的元素,并且id字段匹配。引发异常的代码是

public ActionResult Details(int id = 0)
{
    FilterQueue filterqueue = db.FilterQueues.Single(f => f.FilterQueueId == id);

    if (filterqueue == null)
    {
        return HttpNotFound();
    }
    return View(filterqueue);
}
然而,切换到更详细的编码风格是可行的。像这样:

public ActionResult Details(int id = 0)
{
    FilterQueue filterqueue = null;
    foreach (var f in db.FilterQueues)
    {
        if (f.FilterQueueId == id) filterqueue = f;
    }
    if (filterqueue == null)
    {
        return HttpNotFound();
    }
    return View(filterqueue);
}
有趣的是,如果我让代码只运行过异常,它会抓取正确的项来显示异常的详细信息


现在,当然,我可以将单选切换到单选或默认,这很好;然而,由于第一个代码块是由框架自动编写的,因此我想了解我做错了什么。如果我犯了一个系统性错误,我想用正确的方法纠正它。

我想您正在寻找
SingleOrDefault()

在代码中,您正在检查
null
,而
null
永远不可能是Single()的结果

以下是您想要的:

public ActionResult Details(int id = 0)
{
    FilterQueue filterqueue = db.FilterQueues.SingleOrDefault(f => f.FilterQueueId == id);

    if (filterqueue == null)
    {
        return HttpNotFound();
    }

    return View(filterqueue);
}

我想您正在寻找
SingleOrDefault()

在代码中,您正在检查
null
,而
null
永远不可能是Single()的结果

以下是您想要的:

public ActionResult Details(int id = 0)
{
    FilterQueue filterqueue = db.FilterQueues.SingleOrDefault(f => f.FilterQueueId == id);

    if (filterqueue == null)
    {
        return HttpNotFound();
    }

    return View(filterqueue);
}

在您的第一个代码中,
Single
将永远不会返回
null
,如果没有找到匹配的元素,它将抛出异常

“序列不包含元素”

如果找不到元素,则需要返回
null

使用循环的第二个代码块不是
Single
的等效表示形式<代码>可枚举。如果返回多个与条件匹配的元素,Single将引发异常。但是,您的循环将返回最后一个匹配的项。列表中可能有多个项目,但您永远不会知道。您的循环更类似于
LastOrDefault

foreach (var f in db.FilterQueues)
{
    if (f.FilterQueueId == id) filterqueue = f;
}

在您的第一个代码中,
Single
将永远不会返回
null
,如果没有找到匹配的元素,它将抛出异常

“序列不包含元素”

如果找不到元素,则需要返回
null

使用循环的第二个代码块不是
Single
的等效表示形式<代码>可枚举。如果返回多个与条件匹配的元素,Single将引发异常。但是,您的循环将返回最后一个匹配的项。列表中可能有多个项目,但您永远不会知道。您的循环更类似于
LastOrDefault

foreach (var f in db.FilterQueues)
{
    if (f.FilterQueueId == id) filterqueue = f;
}


鉴于变量的命名,我怀疑OP实际需要的是LINQToEntity解决方案,而不是LinqToObject解决方案。是的,但是
foreach
将在本地枚举整个数据库。@Aron,我不是说要使用
foreach
,我只是想解释一下,代码片段的行为与
Single
不同,我的上一段提到了我对SingleOrDefault的了解。正确的代码不是问题所在。问题是,当我添加控制器时,frameowrk给了我伪造的代码,更重要的是,Linq语句不应该通过第二个代码块抛出该错误作为证据。(是的,我知道它会给我最后一个,但它仍然给我一个。不止一个会是另一个错误)@Xitch13,我不知道你为什么会得到自动生成代码,甚至不知道如何得到,但是,请配置SQL Server以查看为Single生成的查询。鉴于变量的命名,我怀疑OP实际需要的是LinqToEntities解决方案,而不是LinqToObject解决方案。是的,但是
foreach
将在本地枚举整个数据库。@Aron,我不是说要使用
foreach
,我只是想解释一下,代码片段的行为与
Single
不同,我的上一段提到了我对SingleOrDefault的了解。正确的代码不是问题所在。问题是,当我添加控制器时,frameowrk给了我伪造的代码,更重要的是,Linq语句不应该通过第二个代码块抛出该错误作为证据。(是的,我知道它会给我最后一个,但它仍然给我一个。不止一个会是另一个错误)@Xitch13,我不知道你为什么会得到自动生成代码,甚至不知道如何得到,但是,请配置SQL Server以查看为单个生成的查询。您是否使用实体框架以及FilterQueueId的类型?我使用的是实体框架,FilterQueueId是代码中的一个int,也是数据库中的主键。如果您使用的是EF6,您可以尝试按此处所述记录您的查询-。@Stillgar,我来试一试。谢谢你使用的是实体框架,FilterQueueId的类型是什么?我使用的是实体框架,FilterQueueId是代码中的一个int,也是数据库中的主键。如果你使用的是EF6,你可以尝试按此处所述记录查询-。@Stillgar,我来试一试。谢谢我想你错过了我的最后一段。我确实说过我可以使用SingleOrDefault,而这正是我为解决这个问题而选择的。然而,所呈现的代码是我让框架添加控制器时为我编写的代码。我想知道A)为什么我会得到假代码,B)更重要的是,当我检查这些值时,我只有一个回答。我相信你错过了我的最后一段。我确实说过我可以使用SingleOrDefault,而这正是我为解决这个问题而选择的。然而,所呈现的代码是我让框架添加控制器时为我编写的代码。我想知道A)为什么我会得到虚假代码,B)更重要的是,当我检查这些值时,我只有一个响应。