我希望删除表中的所有记录,只要基于数据库中的某些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"] });
}
答案 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
}
}