我如何编辑我的序列,使它只使用LINQ返回一个元素

本文关键字:LINQ 返回 元素 一个 何编辑 编辑 我的 | 更新日期: 2023-09-27 18:18:04

我的代码如下所示:

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);
    }
}
关键是,在我的例子中,foreach语句中的查询返回两个元素。因为正如你所看到的,我的两个类别有两个子类别,因此总共有四个子类别。这将导致错误消息:Sequence contains more than one element时,我尝试Update-Database命令。

正如您所看到的,我的子类别名称都是不同的,因此我还想为此添加一个检查。如果类别id相同,那么我们将检查子类别名称是否与数据库中已经存在的子类别名称不同,因此它将返回一个条目或null。如果有人能帮我实现它,或者给我另一个解决方案,我会很高兴的。

更新:

如果我把它改成:

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

然后执行Update-Database命令,我得到一个新的错误消息说:

更新表项时出错。查看内部异常对细节。

我如何编辑我的序列,使它只使用LINQ返回一个元素

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

应该读……

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

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