2009-07-01 2 views
0

У меня есть таблица базы данных, которая имеет целочисленный столбец SortOrder. В пользовательском интерфейсе для добавления и редактирования элементов таблицы у меня есть выпадающий список Integer, позволяющий пользователю выбирать, где в сортировщике они хотели бы, чтобы этот элемент отображался. Мой вопрос: скажем, список, {1,2,3,4,5, «последний»}, если пользователь выбирает номер aa, я хочу, чтобы это был атрибут SortOrder, а затем элемент с этим «SortOrder», в настоящее время будет набит один (+ = 1), а также предметы с более высоким «SortOrder», не затрагивая элементы с более низким «SortOrder». я в настоящее время есть общедоступный модуль «Утилиты» с помощью VB.NET и LinqЛучшая практика для нумерации элементов в списке? SQL или C#/VB.NET

Private _db Как Новый MyDataContext

Public Sub UpdateProductSortOrder(ByVal idx As Integer) 

    Dim products = (From p As Product In _db.Products _ 
     Where p.SortOrder >= idx _ 
     Select p).ToList() 

    For Each p As Product In products 
     p.SortOrder += 1 
    Next 

    _db.SubmitChanges() 

End Sub 

Это, кажется, работает нормально при добавлении элементов, как я делаю это

Protected Overrides Sub AddItem() 

    Dim sortOrder As Integer = Int32.Parse(Server.HtmlEncode(ddlNewSortOrder.SelectedValue)) 

    If (sortOrder >= 1) Then 
     Utilities.UpdateProductSortOrder(sortOrder) 
    Else 
     sortOrder = Utilities.GetNextProductSortOrder() 
    End If 

    Dim dic As New System.Collections.Specialized.ListDictionary() 
    dic.Add("PROD_Description", Server.HtmlEncode(txtNewDescription.Text)) 
    dic.Add("Abbrev", Server.HtmlEncode(txtNewAbbreviation.Text.ToUpper())) 
    dic.Add("SortOrder", sortOrder) 

    ProductsGridSource.Insert(dic) 

End Sub 

Но я получаю некоторые случайные ошибки при редактировании exisitng таких элементов как

Защищенные субпродуктыGridSource_Updating (ByVal отправитель как объект, по Val е Как System.Web.UI.WebControls.LinqDataSourceUpdateEventArgs) Dim SortOrder As Integer = DirectCast (e.NewObject, продукт) .SortOrder Utilities.UpdateProductSortOrder (SortOrder) End Sub

Есть ли более эффективна, может быть, Лучшая практика, как я должен это делать? Любые советы приветствуются.

Спасибо заранее, ~ ск в Сан-Диего

ответ

1

Трюк для редактирования заключается в том, что вы не хотите обновлять каждое число, а только цифры, на которые влияет изменение.Для одного элемента может быть легко, но если вы редактируете несколько элементов одновременно я бы хранить элементы в список, отсортированный по SortOrder:

Dim products = (From p As Product In _db.Products _ 
     Order By p.SortOrder _ 
     Select p).ToList() 

Тогда я бы переставить список в соответствии с новыми значениями:

// do a RemoveAt first if you need to move an item 
products.InsertAt(sortOrder, dic); 

затем пронумеровать все (или все, начиная с SortOrder, если вы хотите оптимизировать):

Dim index As Integer = 0 
For Each p As Product In products 
    p.SortOrder = index 
    index += 1 
Next 

Если вы делаете все ваши перекройку в одном блоке, то сделать обновление в одном Бло ck вы сохраните некоторую избыточную работу.

Этот подход не будет работать так хорошо, если у вас большой набор записей. В этом случае вам нужно будет разработать более эффективный подход, например, используя базу данных для выполнения вашей работы за вас.

DECLARE @sortOrder INT 
DECLARE @maxSortOrder INT 
SET @sortOrder = 5 
SET @maxSortOrder = 10 
UPDATE Products SET SortOrder = SortOrder + 1 
WHERE SortOrder >= @sortOrder AND SortOrder < @maxSortOrder 
0

При редактировании SortOrder элемента, элементы вам потребуются оригинальные и новые значения.

Если у вас есть 5 пунктов в списке:

  1. Пункт А
  2. Пункт B
  3. Пункт C
  4. Пункт D
  5. Пункт E

И вы хотите для перемещения пункта D до позиции 2, вам нужно только увеличить значение SortOrder для элементов B и С.

Или, если вы двигаетесь товара B вниз в положение 4, то вам необходимо уменьшить значение SortOrder для элементов C и D.

Я бы переименовать метод UpdateProductSortOrder к InsertProductSortOrder, а затем напишите новый метод UpdateProductSortOrder, который принимает 2 аргумента.

Public Sub UpdateProductSortOrder(ByVal originalIdx As Integer, ByVal newIdx As Integer) 

Когда я работаю над проблемами, как это, это помогает мне писать все сценарии на бумаге и рисовать стрелки, чтобы увидеть, какие изменения в списке будет необходимо.

+0

Мне нравится этот подход. Да, я вижу проблему с моей. Я изменяю значения, которые не нужно менять, просто добавляя 1 ко всему. Как я могу реализовать это эффективно с помощью Linq? – Hcabnettek

1

Является ли это многопользовательской системой? Если это так, вам нужно принять это во внимание. Один из способов - заблокировать базу данных, пока вы увеличиваете значения. В противном случае вы рискуете получить поврежденные данные, если два пользователя одновременно запускают код.