使用Linq向SQL上下移动记录

时间:2009-06-29 08:43:26

标签: sql-server linq-to-sql

我需要为上下移动记录(排序)实现一个函数,并使用Linq to SQL 保存排序顺序。我正在使用 SQL Server 2000,但如果有更新版本的SQL Server的解决方案,我可以升级。我很想听听你对如何做的任何想法。

2 个答案:

答案 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进行实际更新。