只要数据库中存在
超过 X 条基于某个 ID 的记录,我想删除表中的所有记录。
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记录?因为我想一直保持 1 张图像UserID
。如果我只是截断它,每次都会删除所有内容,我不知道如何在这里使用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"] });
}
据我所知,您不能为此目的使用截断。 您可以执行以下操作。
DELETE FROM [image]
WHERE [id] IN (SELECT [id]
FROM [image]
WHERE id < (SELECT Max(id)
FROM [image]))
这将省略最后一条记录(按 id),并且性能也比truncate
差,因为它将被记录事务。
@Eduard试试这个
我想这是你的答案
它将删除除最后一个数据之外的所有现有数据并插入一个新数据
这是纯 EF,比子查询更快
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
}
}