如何使用订单列重新排序项目列表并使用 EF Core 更新列表?

问题描述 投票:0回答:2

我在数据库中有这样的对象列表:

    List<YourEntity> entities = new List<YourEntity>
{
    new YourEntity { Id = 1, Name = "Item A", OrderColumn = 1 },
    new YourEntity { Id = 2, Name = "Item B", OrderColumn = 2 },
    new YourEntity { Id = 3, Name = "Item C", OrderColumn = 3 },
    // Add more items as needed
};

我希望我的用户可以更改订购列表的

OrderColumn
值并将新订单保存在数据库中。

使用实体框架核心执行此操作的最佳方法是什么?

另外,我编写了一些方法来执行此操作,但它有问题,当我更改其中一行时,无法正确计算其他行的顺序。

我的方法是:

public static List<T> UpdateOrder(List<T> entities, Func<T, int> getOrder, Action<T, int> setOrder, int itemId, int newOrder)
{
    var itemToMove = entities.SingleOrDefault(e => getOrder(e) == itemId);

    if (itemToMove != null)
    {
        // Determine the current order of the item
        int currentOrder = getOrder(itemToMove);

        // Update the order of the item
        setOrder(itemToMove, newOrder);

        // Update the order of other items accordingly
        foreach (var entity in entities)
        {
            int entityOrder = getOrder(entity);

            if (!EqualityComparer<T>.Default.Equals(entity, itemToMove))
            {
                if (newOrder < currentOrder && entityOrder >= newOrder && entityOrder < currentOrder)
                {
                    setOrder(entity, entityOrder++);
                }
                else if (newOrder > currentOrder && entityOrder <= newOrder && entityOrder > currentOrder)
                {
                    setOrder(entity, entityOrder--);
                }
            }
        }

        // Reorder all items based on the new Order values and return the updated list
        entities = entities.OrderBy(getOrder).ToList();
    }

    return entities;
} 

我正在使用这种方法,例如:

entities = OrderItemsHelper<YourEntity>.UpdateOrder(entities, e => e.Id, (e, order) => e.OrderColumn = order, item.Id, newOrder);
c# entity-framework asp.net-core entity-framework-core blazor
2个回答
0
投票

你错了,你混合了

Id
OrderColumn
UpdateOrder
应该被称为:

var o_entities = UpdateOrder(entities,
    getId: e => e.Id,  // <-- new!!!
    getOrder: e => e.OrderColumn,
    setOrder: (e, order) => e.OrderColumn = order,
    itemId: item.Id,
    newOrder: newOrder);

并更改为:

private static List<T> UpdateOrder<T>(List<T> entities,
    Func<T, int> getId,  // <-- new!!!
    Func<T, int> getOrder,
    Action<T, int> setOrder,
    int itemId,
    int newOrder)
{
    var itemToMove = 
        entities
        .SingleOrDefault(e => getId(e) == itemId); // <-- getId !!!!

它们是代码中的其他主要问题,例如样式、算法等。但是,在我看来,这个问题应该发布在 code review 网站上。


0
投票

要使用 Order 列对项目列表重新排序并使用 Entity Framework Core 更新列表,您需要执行以下步骤:

添加订单栏:

确保您的实体(例如,商品)具有存储订单的属性。例如,您可能有一个 int 类型的属性 Order。 检索列表:

使用 EF Core 按所需顺序检索项目列表。

var orderedItems = dbContext.Items.OrderBy(item => item.Order).ToList();

更新订单:

对项目的 Order 属性进行必要的更改。例如,如果您想将某个项目移动到不同的位置,则需要更新该项目的 Order 属性并相应地调整其他项目的 Order 属性。

// For example, moving item with ID 1 to position 3
var itemToMove = orderedItems.First(item => item.Id == 1);
itemToMove.Order = 3;

// Adjust other items' orders
foreach (var item in orderedItems.Where(item => item.Id != 1 && item.Order >= 3))
    {
        item.Order++;
    }

保存更改:

将更改保存到数据库。

dbContext.SaveChanges();

这将更新数据库中项目的顺序。

请注意,这是一个简化的示例,可能需要根据您的具体应用程序结构进行调整。此外,您可能需要添加错误处理、验证,并且可能需要将这些操作包装在事务中。

© www.soinside.com 2019 - 2024. All rights reserved.