だから私はグラントワークを処理するための空白を書いた。私はSortOrder
列を持つ複数の種類のエンティティでこれを行う必要があるため、SortOrder
列を含むISortable
というインターフェイスを作成しました。 1つのdbテーブルでこれを行う場合は、ISortable
のインスタンスをエンティティの名前に置き換えることができます。このボイドの外で発生する必要がどのような
は次のとおりです。
は、あなたの商品の新しいソート順(newSortOrder
)を設定し、その後、DBからアイテムを取得し、変数(oldSortOrder
)にその古いソート順を保存します変数を、更新したもの以外のすべての項目に設定します(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();
}
}
がvoid並べ替え:
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;
}
}
}
あなたには、いくつかの明確化が必要な場合は、私に教えてください。私はすべてを十分に説明していないことはほとんど確信しています。
これまでEntity Frameworkを使用してこの種の作業を行ってきました。それはSQLにする必要がありますか? –
@BlakeRivell、使用するSQLサーバーを指定してください。 – AlexK
@dansはい私はエンティティフレームワークを使用しています。私はSQL用語で誰かが私に記述するのが最も簡単であると仮定していました。私は剣道のUIソートウィジェットを使用して、リストビューで画像をドラッグ&ドロップし、onChangeは移動したアイテムのoldIndexとnewIndexにアクセスできます。私の計画は、この時点ですべてのレコードのソート順を更新するためにajaxコールを行うことでした。 –