【问题标题】:Renumbering database rows is inefficient对数据库行重新编号效率低下
【发布时间】:2020-01-08 00:25:58
【问题描述】:

我的数据库有一个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。真实代码将具有指示正确值的数据接收数据。但是如果我可以优化上面的代码,我就可以根据我的最终需求进行调整。

【问题讨论】:

  • 抱歉,忘记了我的单票关闭将关闭问题。如果我弄错了,请告诉我!
  • @RufusL:针对该问题显示的技术会在内存中创建数据。我的代码需要更新Sequence 列。这意味着我首先需要阅读该专栏。所以建议的答案并没有真正解决我的问题。
  • @stuartd:如果您仔细查看我的代码,我将更新Sequence 列。我没有对结果进行排序。
  • 对,您可以在查询中添加.Select(t =&gt; t.Sequence) 以仅提取该列,然后使用这些结果更新数据库。但我不介意重新提出问题。

标签: c# asp.net entity-framework entity-framework-core


【解决方案1】:

您应该能够使用Select 语句仅下拉您要更新的列,然后根据this answer 仅更新该列。

此示例可能有效,但遗憾的是我现在无法对其进行测试:

// 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();

【讨论】:

  • 这似乎在我将 PK 添加到 Select() 子句后起作用。不幸的是,它似乎需要对每一行进行单独的查询,但也许没有办法解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多