我的数据库有一个Task
表,Sequence
列。Sequence
列指定任务的顺序。
在某些情况下,我需要更改顺序。所以我会使用这样的东西:
var tasks = (dbContext.Tasks
.Where(t => t.UserId == userId)).ToList();
for (int i = 0; i < tasks.Count; i++)
{
// Set new sequence
tasks[i].Sequence = i;
}
dbContext.SaveChanges();
这似乎效率低下,必须检索集合中每个Task
的每一列。
有没有更有效的方法可以做到这一点?
注意:请不要陷入我只是在上面的代码中将Sequence
设置为i
的事实。实际代码将具有指示正确值的数据接收数据。但是,如果我能优化上面的代码,我就可以根据我的最终需求调整它。
您应该能够使用Select
语句仅下拉要更新的列,然后根据此答案仅更新该列。
这个例子可能有效,但不幸的是我现在无法测试它:
// Query just a single column
var tasks = dbContext.Tasks
.Where(t => t.UserId == userId)
.Select(t => new Task { UserId = t.UserId, Sequence = t.Sequence })
.ToList();
// Update a single column and tell EF to track it
for(int i = 0; i < tasks.Count; i++)
{
tasks[i].Sequence = i;
dbContext.Attach(tasks[i]);
dbContext.Entry(tasks[i]).Property(t => t.Sequence).IsModified = true;
}
// Save the changes to that column
dbContext.SaveChanges();