更新语句以跟踪数据库中的SortOrder

时间:2016-08-22 16:49:21

标签: c# sql sorting

我在屏幕上有一个产品图片列表。当用户将图像拖放到度假村时,我可以访问oldIndex和newIndex。

让我说我有以下内容:
产品1 [指数:0]
产品2 [指数:1]
产品3 [指数:2]
产品4 [指数:3]
产品5 [指数:4]
产品6 [指数:5]

用户决定将Product2放在Product4

之前

我试图弄清楚我的db update语句是什么。我正在阅读另一篇文章,看到有人说你应该更新所有> = newIndex的产品的SortOrder字段,然后再将新产品更新为newIndex。

关于这一点似乎对我而言,这将留下以下内容:
产品1 [指数:0]
产品2 [指数:2]
产品3 [指数:3]
产品4 [指数:4]
产品5 [指数:5]
产品6 [指数:6]

我真的想要实现这一点,我的索引保持完美的顺序,没有间隙。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

IF OBJECT_ID('tempdb..#Product') IS NOT NULL
    DROP TABLE #Product

CREATE TABLE #Product(
    Name VARCHAR(100) NOT NULL
    ,SortOrder INT NOT NULL
)

INSERT INTO #Product (Name, SortOrder)
VALUES 
 ('Product1', 0)
,('Product2', 1)
,('Product3', 2)
,('Product4', 3)
,('Product5', 4)
,('Product6', 5)

DECLARE 
    @NewIndex INT
    ,@OldIndex INT

SET @OldIndex = 4   --'Product5'
SET @NewIndex = 2   -- After 'Product2'

IF @NewIndex < @OldIndex    -- Move UP
    UPDATE #Product
        SET SortOrder = CASE 
                        WHEN SortOrder = @OldIndex THEN @NewIndex 
                        ELSE SortOrder + 1
                        END
    WHERE SortOrder BETWEEN @NewIndex AND @OldIndex;
ELSE                        -- Move DOwn
    UPDATE #Product
        SET SortOrder = CASE 
                        WHEN SortOrder = @OldIndex THEN @NewIndex 
                        ELSE SortOrder - 1
                        END
    WHERE SortOrder BETWEEN @OldIndex AND @NewIndex;

SELECT * FROM #Product ORDER BY SortOrder 

答案 1 :(得分:1)

所以我写了一个虚空来处理咕噜咕噜的工作。由于我需要使用多种类型的实体(所有实体都有SortOrder列)执行此操作,因此我创建了一个名为ISortable的接口,其中包含SortOrder列。如果您只是使用一个db表执行此操作,则可以将ISortable的任何实例替换为您的实体所命名的任何实例。

在这个空白之外需要做的是:

从数据库获取项目并将其旧排序顺序存储在变量(oldSortOrder)中,然后设置项目的新排序顺序(newSortOrder),然后将变量设置为全部其他项目不是您刚刚更新的项目(list)。这也说明了从数据库中删除的项目,只需在您的ajax调用中将newSortOrder设置为0

WebApi方法:

// Code is activated when accessed via http PUT
public void PutItem(int itemId, int newSortOrder)
{
    // using makes sure Context is disposed of properly
    using (var Context = new MyDbContext())
    {
        var oldSortOrder = 0;

        IEnumerable<ISortable> itemsToReorder = null;

        // Get moved item from database
        var item = Context.Items.FirstOrDefault(x => x.ItemId == itemId);

        // Before we set the new sort order, set a variable to the
        // old one. This will be used to reorder the other items.
        oldSortOrder = item.SortOrder;

        // Get all items except the one we grabbed above.
        itemsToReorder = Context.Items.Where(x => x.ItemId != itemId);

        // Delete if the item is set for deletion (newSortOrder = 0)
        if (newSortOrder == 0)
        {
            Context.Items.Remove(item);
        }
        // Otherwise, set the new sort order.
        else
        {
            item.SortOrder = newSortOrder;
        }

        // Pass other items into reordering logic.
        ReOrder(itemsToReorder, oldSortOrder, newSortOrder);

        // Save all those changes back to the database
        Context.SaveChanges();
    }
}

重新排序无效

public static void ReOrder(IEnumerable<ISortable> list, 
    int oldSortOrder, 
    int newSortOrder)
{
    IEnumerable<ISortable> itemsToReorder;

    // Pare down the items to just those that will be effected by the move.
    // New sort order of 0 means the item has been deleted.
    if (newSortOrder == 0)
    {
        itemsToReorder = list.Where(x => x.SortOrder > oldSortOrder);
    }
    else
    {
        // This is just a long inline if statement. Applies Where()
        // conditions depending on the old and new sort variables.
        itemsToReorder = list.Where(x => (oldSortOrder < newSortOrder
            ? x.SortOrder <= newSortOrder &&
            x.SortOrder > oldSortOrder
            : x.SortOrder >= newSortOrder &&
            x.SortOrder < oldSortOrder));
    }

    foreach (var i in itemsToReorder)
    {
        // Original item was moved down
        if (newSortOrder != 0 && oldSortOrder < newSortOrder)
        {
            i.SortOrder -= 1;
        }
        // Original item was moved up
        else if (newSortOrder != 0 && oldSortOrder > newSortOrder)
        {
            i.SortOrder += 1;
        } // Original item was removed.
        else
        {
            i.SortOrder -= 1;
        }
    }
}

如果您需要澄清,请告诉我。我几乎可以肯定我没有充分解释一切。