如果数据不存在则运行条件

时间:2017-09-28 08:43:16

标签: c# entity-framework

请检查以下代码。我认为我有错误的实体查询。如果条件和标记实体查询,请检查第二个内部如果此CategoryID不可用,我的目标是保存数据。但是,当我在调试时运行它时,我可以看到简单的if条件被跳过但是我的数据库没有任何数据所以它应该是空的并且如果在代码内部运行。我认为我做的实体查询有问题,标题如下。有什么想法吗?

  

ctx.Level1Cats.Any(x => x.Level1CatId!= item.CategoryID.ToString())

foreach (CategoryType item in categories)
{
    if (item.CategoryLevel == 1)
    {
        if (ctx.Level1Cats.Any(x => x.Level1CatId != item.CategoryID.ToString()))
        {
            CatLevel1.Level1CatId = item.CategoryID;
            CatLevel1.Name = item.CategoryName;
            ctx.Level1Cats.Add(CatLevel1);
            //ctx.SaveChanges();
        }
        else if (ctx.Level1Cats.Any(x => x.Level1CatId == item.CategoryID.ToString()))
        {
            CatLevel1.Level1CatId = item.CategoryID;
            CatLevel1.Name = item.CategoryName;
            ctx.Entry(CatLevel1).State = EntityState.Modified;
            ctx.SaveChanges();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

要使用现有代码解决您的问题,您可以在All内使用if,然后只使用标准else而无需额外检查:

if (ctx.Level1Cats.All(x => x.Level1CatId != item.CategoryID.ToString()))
{
    ...
}
else
{
    ...
}

如果if不存在,这将进入item.CategoryID阻止(请注意,如果列表本身为空,All将返回true)。否则,将使用您的其他人。

另一个选择是保持Any但反转逻辑:

if (ctx.Level1Cats.Any(x => x.Level1CatId == item.CategoryID.ToString()))
{
    // UPDATE.
}
else
{
    // ADD.
}

在这种情况下,如果任何项目与item.CategoryID匹配,您将执行更新。否则,它将成为Add

根据我的经验,显示的第二个选项更为常见,您可以专门查找感兴趣的项目,然后做出相应的反应。