【问题标题】:Swap two values in a SQL Server table交换 SQL Server 表中的两个值
【发布时间】:2017-02-15 18:48:37
【问题描述】:

我有一个包含两列名称和优先级的表。假设当前数据为 (A,1)(B,2)(C,3)(D,4)。

现在从 UI 中,我正在编辑 D。也就是说,我将 D 的优先级更新为 2。现在我应该将 D 的优先级更新为 2,并将 B 的优先级设置为 4。我正在交换 D 和 B 的优先级。 我该怎么做呢?我的项目使用实体框架。这就是我目前正在做的,

public void Swap(InputObject input)
        {
            NamePriority prio = context.NamePriorities.Where(w => w.Name == input.Name.FirstOrDefault();
            NamePriority prioToSwap = context.NamePriorities.Where(w.Priority == input.Priority).FirstOrDefault();
            prioToSwap.Priority = prio.Priority;
            context.SaveChanges();
            prio.Priority = input.Priority;
            context.SaveChanges();
        }

是否有更简单或更简洁的方法来执行此操作,例如使用 LINQ lambda 表达式或其他方法?

【问题讨论】:

  • 您不需要保存更改两次,如果您再次从数据库中获取它,这将不会反映该值。您要完成的不是定期交换吗?与 int a = 3, int b = 2, int temp= 0 相同; temp=a;a=b;b=tmp?

标签: c# linq c#-4.0 entity-framework-6


【解决方案1】:

只需删除对SaveChanges 的第一次调用即可。您正在做的是选择要修改的两个对象,修改它们并保存更改。我没有看到任何可能使代码更简单的东西。

但是,请注意,您忽略了在数据库中找不到一个或两个对象的可能性。

public void Swap(InputObject input)
{
    NamePriority prio = 
        context.NamePriorities
            .Where(w => w.Name == input.Name).FirstOrDefault();

    if (prio == null) return; // This was missing

    NamePriority prioToSwap = 
        context.NamePriorities
            .Where(w.Priority == input.Priority).FirstOrDefault();

    if (prioToSwap == null) return;  // This was missing

    prioToSwap.Priority = prio.Priority;
    prio.Priority = input.Priority;

    context.SaveChanges();
}

使这段代码有点混乱的部分是选择对象。如果这确实是您必须遵循的领域逻辑,那么就是这样。

您可以尝试简化需要交换的两个对象的选择标准,这就是我所能推荐的。

替代解决方案

我想到你可能使用错误的工具解决问题。

您的设计中优先考虑的目的是什么?从您的示例来看,您似乎在推广上次更新的对象。

为什么要保持优先级而不是让每个对象都用名称和上次更新的时间戳(最初是插入时间)来表示?

如果此组织满足您的域逻辑,则优先考虑对象将转为按时间戳降序排序,而不是明确的优先级,您可以删除整个 Swap 函数。

【讨论】:

  • 是的,问题中的术语令人困惑。术语优先级通常并不意味着这些值是互斥的。具有唯一值可能意味着排名,但我希望在示例中为 B=3、C=4。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
相关资源
最近更新 更多