2017-02-15 5 views
0

У меня есть таблица с двумя столбцами, имя и приоритет. Предположим, что текущие данные (A, 1) (B, 2) (C, 3) (D, 4).Обмен двумя значениями в таблице SQL Server

Теперь из пользовательского интерфейса я редактирую 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; Темп = а; а = Ь; Ь = 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