使用LINQ自动在表中对SNo进行排序

时间:2011-05-03 14:32:04

标签: c# asp.net linq-to-sql

我在数据库表中有几行(我们称之为Customer),每行都由SNo编号,它会自动增加MS SQLServer中固有的标识属性。但是,当我删除特定行时,特定行号留空,但我希望表自动更正。

举个例子:

我有一个示例客户表,其中包含以下行:

SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Duran        21
4   Mark         24

假设我删除第3行,表格如下:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24

但我希望桌子看起来像这样:

SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24

如何在c#中使用LINQ to SQL实现这一目标?这仅适用于gridview中的演示,我不希望在数据库表中更改SNo ,只是想向用户显示正确的顺序。

我正在使用以下代码行:

(db.Components.AsEnumerable().Select((iterator)=> new{iterator.SNo + 1})

但是我没有得到任何结果,我怎么能实现它,我只想让sno增加而不管数据库表中的值

请帮帮我

感谢您的期待

PS:请不要标记它或者因为某些原因你可能会在得到答案后删除

3 个答案:

答案 0 :(得分:1)

  1. 渲染数据时,您可以 增加一个计数器并渲染它 作为行号。

  2. 如果您需要公开数据 消费,你可以添加一个新的 你的班级的“行号”属性, 从中获取数据后 数据库迭代数据, 增加新的财产。

  3. 但这似乎是一个渲染问题,所以我会选择1。

答案 1 :(得分:1)

您可以使用OnRowDataBound活动和TemplateField

执行此操作

这样做:

  1. 在GridView声明中添加OnRowDataBound="GridView1_RowDataBound"

  2. 在GridView中添加TemplateField:

                <asp:TemplateField HeaderText="Serial number">
                    <ItemTemplate>
                        <asp:Label ID="lblSerial" runat="server"></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
    
  3. 在代码隐藏中添加它:

    int i = 1;
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label lblSerial = (Label)e.Row.FindControl("lblSerial");
            lblSerial.Text = i.ToString();
            i++;
        }
    }
    
  4. source

答案 2 :(得分:1)

这不会改变您的SNo,但会为LINQ返回的对象添加一个计数器(CustomerIterator)。

var customers = model1.Customers.AsEnumerable()
  .OrderBy(x => x.SNo)
  .Select((x, iterator) => new { x.SNo, CustomerIterator = iterator + 1, x.CustomerName, x.Age });

增量不是由“迭代器+ 1”部分完成,而是由此处的Select过载完成:http://msdn.microsoft.com/en-us/library/bb534869.aspx。 我刚刚添加了+ 1,因为计数器从0开始