C# 交换SQL Server表中的两个值
我有一个表,有两列,名称和优先级。假设当前数据是(A,1)(B,2)(C,3)(D,4) 现在从用户界面,我正在编辑D。也就是说,我正在将D的优先级更新为2。现在我应该将D的优先级更新为2,并将B的优先级设置为4。我正在交换D和B的优先级。我该怎么做?我的项目使用实体框架。我现在就是这样做的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
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。