gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:24 27 4
gpt4 key购买 nike

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

假设我有以下内容:
产品1[索引:0]
产品2[索引:1]
产品3[索引:2]
产品4[索引:3]
产品5[索引:4]
产品6[索引:5]

然后用户决定将 Product2 放在 Product4 之前

我想知道我的数据库更新语句是什么。我正在阅读另一篇文章,看到有人说您应该更新所有 >= newIndex 的产品的 SortOrder 字段,然后更新新产品以使其位于 newIndex 中。

我觉得这有点不对劲,这会给我留下以下内容:
产品1[索引:0]
产品2[索引:2]
产品3[索引:3]
产品4[索引:4]
产品5[索引:5]
Product6[索引:6]

我真的在努力实现这一目标,让我的索引保持完美的顺序,没有间隙。有什么建议吗?

最佳答案

所以我写了一个 void 来处理繁重的工作。由于我需要对多种类型的实体执行此操作,所有这些实体都有一个 SortOrder 列,因此我创建了一个名为 ISortable 的接口(interface),其中包含一个 SortOrder 专栏。如果您只是对一个数据库表执行此操作,则可以将 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;
}
}
}

如果您需要一些说明,请告诉我。我几乎可以肯定我没有充分解释所有内容。

关于c# - 更新语句以跟踪数据库中的 SortOrder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39084787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com