我需要为上下移动记录(排序)实现一个函数,并使用Linq to SQL 保存排序顺序。我正在使用 SQL Server 2000,但如果有更新版本的SQL Server的解决方案,我可以升级。我很想听听你对如何做的任何想法。
答案 0 :(得分:3)
只需向表中添加一个整数列Index
并根据用户输入修改此索引 - 向上移动只是递减所选记录的索引值并递增前一记录的索引值。
public void MoveUp(Guid id)
{
Item item = Context.Items.Single(i => i.Id == id);
if (item.Index > 0)
{
Item predecessor = Context.Items.Single(i => i.Index == item.Index - 1);
item.Index -= 1;
predecessor.Index += 1;
Context.SaveChanges();
}
}
向下移动,你就完成了。如果您需要多个表,只需使用接口创建通用版本。
答案 1 :(得分:0)
谢谢丹尼尔! 通过查看您的示例,我想出了这个用于对类别中的产品进行分类。
public void MoveUp(int categoryId, int productId, int originalIndex, int newIndex)
{
if (newIndex == originalIndex) return;
var product = _context.CategoryProducts.Single(x => x.CategoryId == categoryId && x.ProductId == productId);
product.SortOrder = newIndex;
_context.CategoryProducts
.Where(x =>
x.CategoryId == categoryId &&
x.ProductId != productId &&
x.SortOrder >= newIndex &&
x.SortOrder <= originalIndex)
.Update(x => { x.SortOrder = x.SortOrder + 1; });
_context.SubmitChanges();
}
public void MoveDown(int categoryId, int productId, int originalIndex, int newIndex)
{
if (newIndex == originalIndex) return;
var product = _context.CategoryProducts.Single(x => x.CategoryId == categoryId && x.ProductId == productId);
product.SortOrder = newIndex;
_context.CategoryProducts
.Where(x =>
x.CategoryId == categoryId &&
x.ProductId != productId &&
x.SortOrder >= originalIndex &&
x.SortOrder <= newIndex)
.Update(x => { x.SortOrder = x.SortOrder - 1; });
_context.SubmitChanges();
}
我使用Hooked on LINQ中的UpdatedExtension进行实际更新。