【问题标题】:Paging with GridView and LINQ to SQL使用 GridView 和 LINQ to SQL 进行分页
【发布时间】:2011-08-26 22:13:44
【问题描述】:

我的网格视图:

<asp:GridView runat="server" ID="MyGridView" AutoGenerateColumns="false" 
    DataKeyNames="ID" 
    OnRowCreated="MyGridView_RowCreated" AllowPaging="true" Width="100%" 
    PageSize="5" onpageindexchanging="MyGridView_PageIndexChanging" >

我在 page_load 上的代码:

MyGridView.DataSource = new Emp.GetData();
MyGridView.DataBind();

我的代码:

using (DataContext db = new DataContext())
{
    var query = //valid query here   

    query = query.Skip(StartRowIndex *5 ).Take(5);

    return query.ToList();
}

如果我的数据库中有 15 条记录,则在页面加载时,我会看到第 1,2 3 页的链接,其中显示了第 1 页的数据 - 5 条记录。然后当我带着 5 条记录进入第 2 页时,我看到了第 1 页和第 3 页的链接。当我转到第 3 页时,我只看到 2 条记录而不是 5 条,有时分页链接也无法正确显示。

我想每页显示 5 条记录,并希望 GridView 确定要显示多少页。

我没有使用 LinqDataSource,只是有一个返回列表的方法。

【问题讨论】:

  • 什么样的LINQ? LINQ to XML?
  • 如果我使用 linqdatasource 我会有 maxrecords 并且以某种方式管理分页。使用gridview 大多数时候我没有得到分页链接。如果我设置 take(maxrowcount) 那么它有时会工作......

标签: c# linq linq-to-sql gridview pagination


【解决方案1】:

如果您确实使用LinqDataSource,实际上会更容易。

<asp:LinqDataSource ID="MyDataSource" runat="server"
    OnSelecting="MyDataSource_Selecting">
</asp:LinqDataSource>

在代码隐藏中,您只需重新路由LinqDataSource 即可调用您的业务逻辑层。但是,它现在需要保持DataContext 对象处于打开状态,即不要将其包装在using 块中,否则您将收到错误消息(也不要使用Skip(..).Take(..) 应用手动分页。

protected void MyDataSource_Selecting(object sender,
        LinqDataSourceSelectEventArgs e) {
    e.Result = Emp.GetData();
}

现在LinqDataSource 应该会自动为您管理所有分页。

【讨论】:

  • 这种方法的问题是你加载了所有的数据。如果有 10000 条记录,您将全部加载它们以获得其中的 5 条。 Skip() 和 Take() 生成适当的 SQL 代码,以便从数据库中只返回需要的内容
  • 不,这不是 LinqDataSource 在启用分页时的工作方式。当你给它一个 LINQ-to-SQL IQueryable 对象时,它只获取它需要的记录是足够聪明的。在返回结果之前,您只是不要关闭DataContext 并先调用ToList
【解决方案2】:

或者,您可以使用PagedDataSource class 来实现此目的。

Here's an article 解释它是如何工作的。

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2015-11-03
    • 2015-12-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多