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);