步步為營VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大資料量分頁、延遲執行和日志記錄
介紹
以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)
// Count查詢操作符(不延遲) - 傳回集合中的元素個數
int c = (from p in ctx.Products
select 0).Count();
return c;
}
通過檢視日志可以發現,單擊第1頁時DLINQ生成的T-SQL語句如下
SELECT TOP 5 [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
SELECT COUNT(*) AS [value]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
通過檢視日志可以發現,單擊第10頁時DLINQ生成的T-SQL語句如下
SELECT TOP 5 [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued]
FROM (
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]
FROM [dbo].[Products] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] > @p0
-- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [45]
本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/345013,如需轉載請自行聯系原作者