同时删除和更新数据库MVC

时间:2016-07-07 02:35:01

标签: sql asp.net-mvc linq crud

我希望删除表中的所有记录,只要基于数据库中的某些ID存在多于X条记录。

        using(ApplicationDbContext app = new ApplicationDbContext())
        {             
            try
            {
                var UserImg = app.Images.Where(x => x.UserID == LoggedUserId).Select(s => s.ID).FirstOrDefault();

                if (UserImg != null)
                {
                    app.Database.ExecuteSqlCommand("TRUNCATE TABLE [Image] LIMIT 2");                 
                }
                else if(UserImg == null)
                {
                    app.Images.Add(img);
                }

                app.SaveChanges();

                return RedirectToAction("Details", "Jobs", new { controller = "JobsController", action = "Details", id = Session["DetailsURL"] });

            }

            catch (DbEntityValidationException ex)
            {
                //non-relevant stuff
            }
        }

更准确地说ExecuteSqlCommand,我如何设法保留X记录?因为我希望始终按UserID保留1张图像。如果我只是截断它会删除每次所有内容,我不知道如何在这里使用LIMIT

基本上我想用一个新的更新当前的图像,如果有另一种方法我觉得更开放尝试。

Solution:

            try
            {                   

                foreach (var id in app.Images.Where(x => x.UserID == LoggedUserId).Select(e => e.ID))
                {
                    var entity = new Image { ID = id };
                    app.Images.Attach(entity);
                    app.Images.Remove(entity);
                }

                app.Images.Add(img);
                app.SaveChanges();

                return RedirectToAction("Details", "Jobs", new { controller = "JobsController", action = "Details", id = Session["DetailsURL"] });

            }

2 个答案:

答案 0 :(得分:2)

就我所知,你不能使用truncate用于此目的。你可以做类似以下的事情。

DELETE FROM [image] 
WHERE  [id] IN (SELECT [id] 
                FROM   [image] 
                WHERE  id < (SELECT Max(id) 
                             FROM   [image])) 

这会遗漏最后一条记录(按id),并且会比truncate表现差,因为它会记录交易。

答案 1 :(得分:1)

@Eduard试试这个

我认为这是你的答案

它将删除除最后一个之外的所有现有数据并插入一个新数据

这是纯EF并且比SubQuerys

更快
using(ApplicationDbContext db = new ApplicationDbContext())
{             
    try
    { 
        //collect all images except final one
        var existImgRows = db.Images.Where(x => x.ID == UserID).OrderByDescending(x => x.ID).Skip(1).Select(x=>x); 

        if(existImgRows != null)
        {
            foreach (var item in existImgRows)
            {
                db.Entry(item).State = System.Data.Entity.EntityState.Deleted;
            }
        }
        db.Entry(img).State = System.Data.Entity.EntityState.Added;
        db.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        //non-relevant stuff
    }
}