2017-02-15 1 views
0

두 개의 열, 이름 및 우선 순위가있는 테이블이 있습니다. 현재 데이터가 (A, 1) (B, 2) (C, 3) (D, 4)라고 가정합시다.SQL Server 테이블에서 두 값을 바꿉니다.

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 람다 표현식 또는 무언가를 사용하는 것과 같이이 작업을 수행 할 수있는 간단한 또는 청소기 방법이 있나요, 나는 현재하고있어 어떻게?

+1

변경 사항을 두 번 저장하지 않아도됩니다. 데이터베이스에서 다시 가져 오는 경우 값을 반영하지 않습니다. 당신이 성취하고자하는 것은 정규 스왑이 아닙니까? int a = 3, int b = 2, int temp = 0과 동일; temp = 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

관련 문제