如果它存在,.Remove()它,如果不存在.Add()它

时间:2018-02-09 09:23:47

标签: c# linq entity-framework-core

我有这个动作方法来检查某个项目是否存在,如果存在,则将其删除。如果它不存在,则添加它。它就像是特定项目的开关:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> FrontPageProduct(ViewModelFrontPageProduct frontPageProduct)
{
    var fpp = new FrontPageProduct()
    {
        ProductCategoryId = frontPageProduct.ProductCategoryId,
        ProductId = frontPageProduct.ProductId,
        SortOrder = 0
    };
    bool exists = _context.FrontPageProducts
        .Any(x => x.ProductCategoryId == frontPageProduct.ProductCategoryId 
        && x.ProductId == frontPageProduct.ProductId);
    if (exists)
    {
        var delete = (from d in _context.FrontPageProducts
                         where (d.ProductCategoryId == frontPageProduct.ProductCategoryId && 
                         d.ProductId == frontPageProduct.ProductId)
                         select d).FirstOrDefault();
        _context.Remove(delete);
    }
    else
    {
        _context.Add(fpp);
    }
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index), new { id = fpp.ProductCategoryId, tab = 2 });
}

现在,我觉得这有点长啰嗦。这样做是否有更短但仍然可读的方式?

1 个答案:

答案 0 :(得分:5)

您不必使用Any来确定它是否存在。基本上使用FirstOrDefault加载它(我使用异步,因为我看到你在保存时使用异步,你也可以在FirstOrDefault中使用它)。如果发现你有一个实例,你可以删除它而无需额外加载:

var fpp = new FrontPageProduct()
{
    ProductCategoryId = frontPageProduct.ProductCategoryId,
    ProductId = frontPageProduct.ProductId,
    SortOrder = 0
};

var fppDB = await _context.FrontPageProducts
    .FirstOrDefaultAsync(x => x.ProductCategoryId == frontPageProduct.ProductCategoryId && x.ProductId == frontPageProduct.ProductId);

if (fppDB != null)
{
    _context.Remove(fppDB);
}
else
{
    _context.Add(fpp);
}

await _context.SaveChangesAsync();

否则您也可以使用SQL存储过程并从EF调用此存储过程。它会更有效率。