Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 交换SQL Server表中的两个值_C#_Linq_C# 4.0_Entity Framework 6 - Fatal编程技术网

C# 交换SQL Server表中的两个值

C# 交换SQL Server表中的两个值,c#,linq,c#-4.0,entity-framework-6,C#,Linq,C# 4.0,Entity Framework 6,我有一个表,有两列,名称和优先级。假设当前数据是(A,1)(B,2)(C,3)(D,4) 现在从用户界面,我正在编辑D。也就是说,我正在将D的优先级更新为2。现在我应该将D的优先级更新为2,并将B的优先级设置为4。我正在交换D和B的优先级。我该怎么做?我的项目使用实体框架。我现在就是这样做的 public void Swap(InputObject input) { NamePriority prio = context.NamePriorities.Wh

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

现在从用户界面,我正在编辑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表达式之类的?

只需删除对
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();
}
使这段代码有点混乱的部分是选择对象。如果这真的是你必须遵循的领域逻辑,那么就是它

您可以尝试简化需要交换的两个对象的选择标准,这就是我的全部建议

替代解决方案

我突然想到,你可能使用了错误的工具来解决这个问题

您的设计中优先权的目的是什么?从您的示例来看,您似乎正在升级上次更新的对象

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


如果此组织满足您的域逻辑,那么对对象进行优先级排序将转向按时间戳降序排序,而不是显式优先级,您可以删除整个
交换功能。

您不需要保存更改两次,这将不会反映您从数据库中再次获取更改时的值。您想要完成的不是常规交换?与int a=3、int b=2、int temp=0相同;温度=a;a=b;b=tmp?是的,这个问题中的术语令人困惑。术语优先级通常并不意味着这些值是互斥的。拥有唯一的值可能意味着排名,但我希望示例中的B=3,C=4。