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

时间:2014-08-14 14:06:44

标签: 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", 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命令,我收到一条新的错误消息:

  

更新条目时发生错误。查看内部异常   详情。

1 个答案:

答案 0 :(得分:3)

 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意味着您知道可能有多个元素与您的查询匹配,但您只需要第一个元素。