これが私が問題を解決した方法ですが、もっと賢い方法があるかもしれないと思います。
更新する必要があるオブジェクトは、ポリシーワークロードアイテムです。これらのそれぞれに優先順位が関連付けられています。同じ優先度のポリシーワークロードアイテムは存在できません。したがって、ユーザーが優先度を更新すると、それに応じて他の優先度を上下にシフトする必要があります。
このハンドラーはリクエストオブジェクトを受け取ります。リクエストにはIDと優先度があります。
public class UpdatePriorityCommand
{
public int PolicyWorkloadItemId { get; set; }
public int Priority { get; set; }
}
このクラスは、次のコードでリクエストオブジェクトを表します。
//Get the item to change priority
PolicyWorkloadItem policyItem = await _ctx.PolicyWorkloadItems
.FindAsync(request.PolicyWorkloadItemId);
//Get that item's priority and assign it to oldPriority variable
int oldPriority = policyItem.Priority.Value;
//Get the direction of change.
//-1 == moving the item up in list
//+1 == moving the item down in list
int direction = oldPriority < request.Priority ? -1 : 1;
//Get list of items to update...
List<PolicyWorkloadItem> policyItems = await _ctx.PolicyWorkloadItems
.Where(x => x.PolicyWorkloadItemId != request.PolicyWorkloadItemId)
.ToListAsync();
//Loop through and update values
foreach(var p in policyItems)
{
//if moving item down in list (I.E. 3 to 1) then only update
//items that are less than the old priority. (I.E. 1 to 2 and 2 to 3)
//items greater than the new priority need not change (i.E. 4,5,6... etc.)
//if moving item up in list (I.E. 1 to 3)
//items less than or equal to the new value get moved down. (I.E. 2 to 1 and 3 to 2)
//items greater than the new priority need not change (i.E. 4,5,6... etc.)
if(
(direction > 0 && p.Priority < oldPriority)
|| (direction < 0 && p.Priority > oldPriority && p.Priority <= request.Priority)
)
{
p.Priority += direction;
_ctx.PolicyWorkloadItems.Update(p);
}
}
//finally update the priority of the target item directly
policyItem.Priority = request.Priority;
//track changes with EF Core
_ctx.PolicyWorkloadItems.Update(policyItem);
//Persist changes to database
await _ctx.SaveChangesAsync(cancellationToken);