在SQL Server表中交换两个值

时间:2017-02-15 18:48:37

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

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

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

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表达式更简单或更简洁的方法?

1 个答案:

答案 0 :(得分: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函数。