我有一个包含两列名称和优先级的表。假设当前数据是(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表达式更简单或更简洁的方法?
答案 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
函数。