步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录

作者:webabcd

介绍
以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;
        }
}
通过查看日志可以发现,单击第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]
FROM [dbo].[Products] AS [t0]
-- 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]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1

SELECT COUNT(*) AS [value]
FROM [dbo].[Products] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1


OK
[源码下载]

本文出自 “webabcd” 博客,请务必保留此出处http://webabcd.blog.51cto.com/1787395/345013

.NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录相关推荐

  1. SQL Server 大数据量插入和索引关系

    如果表含有聚集索引,并对要插入的数据进行排序以匹配聚集索引键,则将把数据大容量复制到已经存在聚集索引的表中,并指定 ORDER 提示. 这比先将数据复制到表中再创建聚集索引明显要快. 如果表上还存在非 ...

  2. .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理

    步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理 作者:webabcd 介绍 以Northwind为示例数据库,DLINQ(LINQ ...

  3. .NET 3.5 - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除

    步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加.查询.更新和删除 作者:webabcd 介绍 以Northwind为示例数据库,DLINQ ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    SQL Server 大数据搬迁之文件组备份还原实战 原文:SQL Server 大数据搬迁之文件组备份还原实战 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景( ...

  5. 05.SQL Server大数据群集小试牛刀--HDFS查询

    05.SQL Server大数据群集小试牛刀--HDFS查询 SQL Server大数据群集查询HDFS ,利用之前创建好的大数据群集,使用官方提供的测试数据进行测试.脚本是官方的脚本,要知道干了什么 ...

  6. SQL千万级大数据量查询优化

    转发自:https://blog.csdn.net/long690276759/article/details/79571421?spm=1001.2014.3001.5506* (防止查询资料找不到 ...

  7. 任何抛开业务谈大数据量的sql优化都是瞎扯

    周三去某在线旅游公司面试.被问到了一个关于数据量大的优化问题.问题是:一个主外键关联表,主表有一百万数据,外键关联表有一千万的数据,要求做一个连接. 本人接触过单表数据量最大的就是将近两亿行历史数据( ...

  8. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠

    03.三月风雨愁断肠,学习大数据特别忧伤--谈谈AKS创建SQL Server大数据群集创建愁断肠 [TOC] 前言 使用AKS创建SQL Server大数据群集有几种方法,由于产品不断的更新,SQL ...

  9. SQL Server 大数据群集 部署(二)工具篇

    SQL Server 大数据群集 部署(二)工具篇 在进行部署大数据群集之前,先要安装一系列的工具,下表列出了常用的大数据群集工具以及如何安装它们: 工具 Required Description 安 ...

最新文章

  1. java中实现选择文件_Java 实现文件选择对话框及功能
  2. python前端开发招聘_web前端和python学哪个出来工资高?
  3. SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
  4. Linux同步自己的配置,Linux学习心得之——Rsync同步配置
  5. 高德最佳实践:Serverless规模化落地有哪些价值?
  6. django中实现websocket
  7. javascript中addEventListener与removeEventListener
  8. 孙宇晨:BM跑路或是觉得做项目是一种负担
  9. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
  10. 2021年计算机网络常见面试题
  11. 【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】
  12. python结巴分词 每个词一行,python-结巴分词+词云展示
  13. 拉勾网离职风波引人深思 互联网招聘网站还有未来吗?
  14. loadlibrary failed with error 126:找不到指定模块 解决方法
  15. Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
  16. redhat 下 oracle 10G RAC 集群 详细安装
  17. js进阶实例,数字时钟
  18. csgo服务器取消自动踢人,CSGO踢出玩家Kick相关控制台指令
  19. 机器人削面机的种类和价格_刀削面机器人价格与人工相比一年低一半
  20. python笔记4:数据归一化(0,1),归至(-1,1)

热门文章

  1. 剑指offer 答案 python_【剑指offer】【python】面试题2~5
  2. C++STL笔记(一):STL综述
  3. android smart home,Android smart home system based on ATmega16
  4. amf组网_【5G核心网】5G核心网SA组网方案及4G/5G互操作探讨
  5. 矩形变弧度角_懒惰使人类进步:不想刷马桶,那就让马桶自己变干净丨种草机...
  6. 一文搞懂C++强制类型转换
  7. linux 可道云_如何搭建私有云
  8. 计算机控制与网络,网络与通信技术在计算机控制的作用
  9. linux如何停止死循环脚本,Linux Shell教程(一)
  10. rf连oracle版本一致,Navicat premium连不上Oracle的问题解决