我有这个动作方法来检查某个项目是否存在,如果存在,则将其删除。如果它不存在,则添加它。它就像是特定项目的开关:
[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 });
}
现在,我觉得这有点长啰嗦。这样做是否有更短但仍然可读的方式?
答案 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调用此存储过程。它会更有效率。