我正在尝试用EF数据库创建一个MVC4应用程序,我刚刚开始在2天前自己学习。 我面临的问题是我有一个客户列表,其属性为“IsDeleted”,其值为true或false。
基本上我想通过点击链接或按钮删除所有同时将IsDeleted属性标记为true的客户。
到目前为止,我已经尝试过这些,但似乎我对它的运作方式仍然有点模糊:
在我的CustomerController中,我添加了以下代码:
public ActionResult DeleteAll()
{
List<Customer> cusList = new List<Customer>();
IEnumerable<Customer> customerList = db.Customers.ToList().Where(i => i.IsDeleted == true);
foreach (var Item in customerList) { cusList.Add(Item); }
return View(customerList);
}
[HttpPost, ActionName("DeleteAll")]
[ValidateAntiForgeryToken]
public ActionResult DeleteAllConfirmed()
{
List<Customer> cusList = new List<Customer>();
IEnumerable<Customer> customerList = db.Customers.ToList().Where(i => i.IsDeleted == true);
foreach (var Item in customerList) { cusList.Add(Item); }
foreach (var item in cusList) { db.Customers.Remove(item); }
return RedirectToAction("Index");
}
所以我有点不确定下一步该去哪,或者即使这样做是可行的。 如果它可行,如何在视图中调用此操作?
任何想法都会受到赞赏。
致以最诚挚的问候,
答案 0 :(得分:3)
你的post方法中有一些冗余代码。您正在查询数据库并获得所需的结果。反过来,这些实体被抛入一个列表中,然后在迭代它们以删除它们。此外,您忘记告诉您的上下文保存更改。你可以通过缩短这个来缩短一些时间,内存和cpu周期:
[HttpPost, ActionName("DeleteAll")]
[ValidateAntiForgeryToken]
public ActionResult DeleteAllConfirmed()
{
IEnumerable<Customer> customerList = db.Customers.Where(i => i.IsDeleted == true);
//Now you have everything you need.
foreach (var Item in customerList)
{
//Remove
db.Customers.Remove(Item);
}
//and save. done
db.SaveChanges(); //important!
return RedirectToAction("Index");
}
您的DeleteAll()
方法也存在一些缺陷。您正在向cusList
添加项目,但您永远不会使用它!
public ActionResult DeleteAll()
{
IEnumerable<Customer> customerList = db.Customers.Where(i => i.IsDeleted == true);
return View(customerList);
}
如果您愿意,可以将其减少到一行:
public ActionResult DeleteAll()
{
return View(db.Customers.Where(i => i.IsDeleted == true));
}
我还有点不确定,你对于如何在视图中调用它是什么意思。