步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
2007-12-24 10:41
771 查看
[align=center]步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录[/align]
作者:webabcd
from:http://www.cnblogs.com/webabcd/archive/2007/10/22/932632.html
介绍
以Northwind为示例数据库,DLINQ(LINQ to SQL)之结合GridView控件和ObjectDataSource控件演示大数据量分页,同时介绍延迟执行和日志记录
示例
PagingAndLogging.aspx
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
<%
![](http://www.cnblogs.com/Images/dot.gif)
@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PagingAndLogging.aspx.cs"
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Inherits="LINQ_DLINQ_PagingAndLogging" Title="大数据量分页、延迟执行和日志记录" %>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:Content>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:GridView ID="gvProduct" runat="server" DataSourceID="odsProduct" AllowPaging="True" PageSize="5">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:GridView>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:ObjectDataSource ID="odsProduct" runat="server" EnablePaging="True" SelectCountMethod="GetProductCount"
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SelectMethod="GetProduct" TypeName="PagingAndLogging">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<SelectParameters>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Parameter Name="startRowIndex" Type="Int32" DefaultValue="0" />
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="10" />
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</SelectParameters>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:ObjectDataSource>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:Content>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
PagingAndLogging.cs
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Data;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Configuration;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Linq;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.Security;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls.WebParts;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.HtmlControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Xml.Linq;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.ComponentModel;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.IO;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DAL;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// PagingAndLogging 的摘要说明
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[DataObject]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class PagingAndLogging
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DataObjectMethod(DataObjectMethodType.Select, true)]
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public List<Products> GetProduct(int startRowIndex, int maximumRows)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NorthwindDataContext ctx = new NorthwindDataContext();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// System.Data.Linq.DataContext的记录日志的功能
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ctx.Log = sw;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
var products = (from p in ctx.Products
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
select p).Skip(startRowIndex).Take(maximumRows);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// products实现了IQueryable<T>接口
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 所以可以用如下方法从中获取DbCommand
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
System.Data.Common.DbCommand cmd = ctx.GetCommand(products);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string commandText = cmd.CommandText;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (System.Data.Common.DbParameter param in cmd.Parameters)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string parameterName = param.ParameterName;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
object value = param.Value;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 延迟执行(Deferred Execution)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// products实现了IEnumerable<T>接口
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// IEnumerable<T>接口的一个特性是,实现它的对象可以把实际的查询运算延迟到第一次对返回值进行迭代(yield)的时候
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// ToList()之前,如果是LINQ to SQL的话,那么就可以通过products.ToString()查看LINQ生成的T-SQL
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// ToList()后则执行运算
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
var listProducts = products.ToList();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 执行运算后System.Data.Linq.DataContext会记录日志,所以应该在执行运算后Close掉StreamWriter
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Flush();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Close();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return listProducts;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public int GetProductCount(int startRowIndex, int maximumRows)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NorthwindDataContext ctx = new NorthwindDataContext();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ctx.Log = sw;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// Count查询操作符(不延迟) - 返回集合中的元素个数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int c = (from p in ctx.Products
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
select 0).Count();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Flush();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Close();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return c;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
通过查看日志可以发现,单击第1页时DLINQ生成的T-SQL语句如下
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT TOP 5 [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT COUNT(*) AS [value]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
通过查看日志可以发现,单击第10页时DLINQ生成的T-SQL语句如下
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT TOP 5 [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM (
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]) AS [ROW_NUMBER], [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
) AS [t1]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
WHERE [t1].[ROW_NUMBER] > @p0
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [45]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT COUNT(*) AS [value]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
OK
作者:webabcd
from:http://www.cnblogs.com/webabcd/archive/2007/10/22/932632.html
介绍
以Northwind为示例数据库,DLINQ(LINQ to SQL)之结合GridView控件和ObjectDataSource控件演示大数据量分页,同时介绍延迟执行和日志记录
示例
PagingAndLogging.aspx
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
<%
![](http://www.cnblogs.com/Images/dot.gif)
@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PagingAndLogging.aspx.cs"
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Inherits="LINQ_DLINQ_PagingAndLogging" Title="大数据量分页、延迟执行和日志记录" %>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:Content>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:GridView ID="gvProduct" runat="server" DataSourceID="odsProduct" AllowPaging="True" PageSize="5">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:GridView>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:ObjectDataSource ID="odsProduct" runat="server" EnablePaging="True" SelectCountMethod="GetProductCount"
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SelectMethod="GetProduct" TypeName="PagingAndLogging">
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<SelectParameters>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Parameter Name="startRowIndex" Type="Int32" DefaultValue="0" />
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="10" />
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</SelectParameters>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:ObjectDataSource>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</asp:Content>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
PagingAndLogging.cs
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Data;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Configuration;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Linq;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.Security;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.WebControls.WebParts;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Web.UI.HtmlControls;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Xml.Linq;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.ComponentModel;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Collections.Generic;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.IO;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DAL;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// PagingAndLogging 的摘要说明
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[DataObject]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class PagingAndLogging
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DataObjectMethod(DataObjectMethodType.Select, true)]
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public List<Products> GetProduct(int startRowIndex, int maximumRows)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NorthwindDataContext ctx = new NorthwindDataContext();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// System.Data.Linq.DataContext的记录日志的功能
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ctx.Log = sw;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
var products = (from p in ctx.Products
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
select p).Skip(startRowIndex).Take(maximumRows);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// products实现了IQueryable<T>接口
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 所以可以用如下方法从中获取DbCommand
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
System.Data.Common.DbCommand cmd = ctx.GetCommand(products);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string commandText = cmd.CommandText;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (System.Data.Common.DbParameter param in cmd.Parameters)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string parameterName = param.ParameterName;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
object value = param.Value;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 延迟执行(Deferred Execution)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// products实现了IEnumerable<T>接口
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// IEnumerable<T>接口的一个特性是,实现它的对象可以把实际的查询运算延迟到第一次对返回值进行迭代(yield)的时候
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// ToList()之前,如果是LINQ to SQL的话,那么就可以通过products.ToString()查看LINQ生成的T-SQL
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// ToList()后则执行运算
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
var listProducts = products.ToList();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 执行运算后System.Data.Linq.DataContext会记录日志,所以应该在执行运算后Close掉StreamWriter
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Flush();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Close();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return listProducts;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public int GetProductCount(int startRowIndex, int maximumRows)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
NorthwindDataContext ctx = new NorthwindDataContext();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
StreamWriter sw = new StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath + "Log.txt", true);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ctx.Log = sw;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// Count查询操作符(不延迟) - 返回集合中的元素个数
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int c = (from p in ctx.Products
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
select 0).Count();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Flush();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sw.Close();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return c;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
通过查看日志可以发现,单击第1页时DLINQ生成的T-SQL语句如下
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT TOP 5 [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT COUNT(*) AS [value]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
通过查看日志可以发现,单击第10页时DLINQ生成的T-SQL语句如下
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT TOP 5 [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM (
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]) AS [ROW_NUMBER], [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
) AS [t1]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
WHERE [t1].[ROW_NUMBER] > @p0
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [45]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SELECT COUNT(*) AS [value]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
FROM [dbo].[Products] AS [t0]
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
OK
相关文章推荐
- 步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
- 步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
- 步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
- 步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
- 9、步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载
- DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
- 步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载
- 步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理
- 步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理
- 10、步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理
- 步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除