C# 如何编辑序列,使其仅使用LINQ返回一个元素

C# 如何编辑序列,使其仅使用LINQ返回一个元素,c#,asp.net-mvc,database,linq,C#,Asp.net Mvc,Database,Linq,我的代码如下所示: var subcategories = new List<Subcategory> { new Subcategory { SubcategoryName = "Football", CategoryID = categories.Single(c => c.CategoryName == "Sport").CategoryID }, new Subcategory { SubcategoryName = "Basketball", Cate

我的代码如下所示:

var subcategories = new List<Subcategory>
{
    new Subcategory { SubcategoryName = "Football", CategoryID = categories.Single(c => c.CategoryName == "Sport").CategoryID },
    new Subcategory { SubcategoryName = "Basketball", CategoryID = categories.Single(c => c.CategoryName == "Sport").CategoryID },
    new Subcategory { SubcategoryName = "Piano", CategoryID = categories.Single(c => c.CategoryName == "Music").CategoryID },
    new Subcategory { SubcategoryName = "Violin", CategoryID = categories.Single(c => c.CategoryName == "Music").CategoryID }
};

foreach (Subcategory s in subcategories)
{
    var subcategoriesInDB = context.Subcategories.Where(c => c.Category.CategoryID == s.CategoryID).SingleOrDefault();

    if (subcategoriesInDB == null)
    {
        context.Subcategories.Add(s);
    }
}
然后执行更新数据库命令,我会收到一条新的错误消息:

更新条目时出错。查看内部异常 详情请参阅

应该是

 var subcategoriesInDB = context.Subcategories.FirstOrDefault(c => c.Category.CategoryID == s.CategoryID);

使用
SingleOrDefault
意味着只返回一个元素。如果没有,您将得到
null
,如果有多个,您将得到一个异常,让您知道有多个(即,不是您期望的)。使用
FirstOrDefault
意味着您知道可能有多个元素与您的查询匹配,但您只需要第一个元素。

当我将其更改为FirstOrDefault并执行“更新数据库”命令时,会收到一条错误消息,提示:更新条目时出错。有关详细信息,请参阅内部异常。这可能是因为现在您的代码正在通过异常,因此您看到的错误与您实际尝试实现的目标更为密切相关(稍远)。恐怕这是另一个问题。无论您将谓词(
where
FirstOrDefault
)放在何处,生成的查询都是相同的,我认为正确。在获取所需内容之前,我可能会对调用
ToList()
感到困惑。正如我(下面)所说,您需要提供一个“执行updatea数据库命令”的代码示例。那将是一个不同的问题。
 var subcategoriesInDB = context.Subcategories.Where(c => c.Category.CategoryID == s.CategoryID).SingleOrDefault();
 var subcategoriesInDB = context.Subcategories.FirstOrDefault(c => c.Category.CategoryID == s.CategoryID);