我在数据库中有这样的对象列表:
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);
你错了,你混合了
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 网站上。
要使用 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();
这将更新数据库中项目的顺序。
请注意,这是一个简化的示例,可能需要根据您的具体应用程序结构进行调整。此外,您可能需要添加错误处理、验证,并且可能需要将这些操作包装在事务中。