linq to sql 分页 的几种方法

1.数据的分布Skip()和take()

Skip(100)代表跳过100行后.从第101行开始分页;

take(10)表示多少行分页;

例:

var result=from pdt in db.Product

                 select pdt;

this.dataview.DataSource=result.Skip(10).take(10);

this dataview.DataBind();

注:这种方式一次性查询出来所有数据,然后再分页;

2.下面的方式是每个提交时绑定的都是特定的数据,而非所有数据;

public overridevoid DataBind()

{

     db.log=this.response.output;

          var result=from pdt in db.product

                             select pdt;

          int skipNumber=Int.parse(this.textbox1.text)*10;

           this.dataview.DataSource=result.Skip(skipNumber).take(10);

           this dataview.DataBind();

}

protected void NextButton_Click(Object sender,EventArgs e)

{

this textbox1.text=(int.parse(this.textbox1.text)+1).ToString);

this.DataBind();

}

protected void form_Load(Object send,EventArgs e)

{

        if (!this.IsPostBack)

         {

                   this.DataBind();

       }

}

4、

费话不多说,主要是Linq中的Skip及Take这二个扩展方法

int RecordCount = 0;
int PageCount = 1;
DataClassesDataContext data = new DataClassesDataContext();
int SkipIndex = 0;
private string _PageString = "";
public string PageString
{
get {
return _PageString;
}
set {
_PageString = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
RecordCount = data.Orders.Count(); //得到记录数
PageCount = (int)Math.Ceiling((decimal)RecordCount / 10); //以10条记录为一页,计算总页码
int page = 1;
if (!string.IsNullOrEmpty(Request.QueryString["page"]))
page = Convert.ToInt16(Request.QueryString["page"]);
SkipIndex = (page-1) * 10; //计算起始索引,以供后面的Skip扩展方法之用

//拼接分页代码
StringBuilder sb = new StringBuilder();
for (int i = 1; i < PageCount; i++)
{
sb.AppendFormat(@" <a href=""?page={0}"">{0}</a> ",i);
}
_PageString = sb.ToString();
bind();
}
void bind()
{
//奇妙的Linq表达式
var q = (from c in data.Orders select new
{ CustomerID = c.CustomerID, ShipAddress=c.ShipAddress,ID = c.OrderID}
).Skip(SkipIndex).Take(10);
this.GridView1.DataSource = q;
this.GridView1.DataBind();
}

当显示的是第一页时,看linq表达式中为我们动态生成了什么样的语句:

SELECT TOP 10 [t0].[CustomerID], [t0].[ShipAddress], [t0].[OrderID] AS [ID]
FROM [dbo].[Orders] AS [t0]


6、以Northwind为示例数据库,DLINQ(LINQ to SQL)之结合GridView控件和ObjectDataSource控件演示大数据量分页,同时介绍延迟执行和日志记录

  示例
  PagingAndLogging.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PagingAndLogging.aspx.cs"
    Inherits="LINQ_DLINQ_PagingAndLogging" Title="大数据量分页、延迟执行和日志记录" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<asp:GridView ID="gvProduct" runat="server" DataSourceID="odsProduct" AllowPaging="True" PageSize="5">
</asp:GridView>
<asp:ObjectDataSource ID="odsProduct" runat="server" EnablePaging="True" SelectCountMethod="GetProductCount"
SelectMethod="GetProduct" TypeName="PagingAndLogging">
<SelectParameters>
<asp:Parameter Name="startRowIndex" Type="Int32" DefaultValue="0" />
<asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="10" />
</SelectParameters>
</asp:ObjectDataSource>
</asp:Content>

  PagingAndLogging.cs

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.IO;
using DAL;
/** <summary>
/// PagingAndLogging 的摘要说明
/// </summary>
[DataObject]
public class PagingAndLogging
{
[DataObjectMethod(DataObjectMethodType.Select, true)]
public List<Products> GetProduct(int startRowIndex, int maximumRows)
{
NorthwindDataContext ctx = new NorthwindDataContext();
// System.Data.Linq.DataContext的记录日志的功能
        StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
ctx.Log = sw;
var products = (from p in ctx.Products
select p).Skip(startRowIndex).Take(maximumRows);
// products实现了IQueryable<T>接口
// 所以可以用如下方法从中获取DbCommand
        System.Data.Common.DbCommand cmd = ctx.GetCommand(products);
string commandText = cmd.CommandText;
foreach (System.Data.Common.DbParameter param in cmd.Parameters)
{
string parameterName = param.ParameterName;
object value = param.Value;
}
// 延迟执行(Deferred Execution)
// products实现了IEnumerable<T>接口
// IEnumerable<T>接口的一个特性是,实现它的对象可以把实际的查询运算延迟到第一次对返回值进行迭代(yield)的时候
// ToList()之前,如果是LINQ to SQL的话,那么就可以通过products.ToString()查看LINQ生成的T-SQL
// ToList()后则执行运算
        var listProducts = products.ToList();
// 执行运算后System.Data.Linq.DataContext会记录日志,所以应该在执行运算后Close掉StreamWriter
        sw.Flush();
sw.Close();
return listProducts;
}
public int GetProductCount(int startRowIndex, int maximumRows)
{
NorthwindDataContext ctx = new NorthwindDataContext();
StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
ctx.Log = sw;
// Count查询操作符(不延迟) - 返回集合中的元素个数
        int c = (from p in ctx.Products
select 0).Count();
sw.Flush();
sw.Close();
return c;
}
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sonda/archive/2009/09/26/4596874.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值