2017-02-15 178 views
0

我有一個包含兩列的表,名稱和優先級。我們假設當前的數據是(A,1)(B,2)(C,3)(D,4)。交換SQL Server表中的兩個值

現在從用戶界面,我正在編輯D.這是我正在更新D的優先級爲2.現在我應該更新D的優先級爲2,並將B的優先級設置爲4.我交換D和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表達式什麼?

+1

您不需要保存更改兩次,如果您再次從數據庫中獲取該值,則不會反映該值。你想完成什麼不是經常性的交換?與int a = 3相同,int b = 2,int temp = 0;溫度= A; A = B; B = TMP? – Zinov

回答

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函數。

+0

是的,術語在這個問題上是混淆的。術語優先級通常並不意味着這些值是相互排斥的。具有獨特的價值觀可能意味着排名,但在這個例子中,我預計B = 3,C = 4。 – Ehz