步步为营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)之大数据量分页、延迟执行和日志记录


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




     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345013,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
原文:C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较 使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新   使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较 由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。
3303 0
[20121019]8k数据块到底能放多少行记录.txt
[20121019]8k数据块到底能放多少行记录.txt 前一阵子聚会,被问及一个8k数据块能够放多少行记录,我记得以前piner的书提高过,73X条. 实际上表sys.tab$的spare1字段保存的Hakan Factor,即该表数据块的最大行号,各种数据块的大小不同, spare1的缺省值也不一样。
610 0
[20121227]dataguard下执行延迟recover的问题.txt
[20121227]dataguard下执行recover managed standby database disconnect from session delay 720.txtrecover managed standby database disconnect from session delay 720 ;alter database recover managed standby database disconnect from session delay 720 ;100.31机器,从网络流量看,出现一个很奇怪的情况,流量很大。
760 0
开启数据智慧,阿里云大数据团队调研高新区
随着“云计算”、“互联网”、“物联网”的快速发展,大数据(Big Data)也吸引了越来越多的人关注,成为社会热点之一。大街小巷不论是技术人员、咨询人士以及各行各业的精英达人都在探讨着“大数据”,“大数据”显然已经成为新一代“网红”。
2011 0
PHP中双引号引起的命令执行漏洞
PHP中双引号引起的命令执行漏洞在PHP语言中,单引号和双引号都可以表示一个字符串,但是对于双引号来说,可能会对引号内的内容进行二次解释,这就可能会出现安全问题。 0|1正文举个简单例子 <?php$a = 1;$b = 2;echo '$a$b';//输出结果为$a$becho "$a$b";//输出结果为12?>可以看到这两个输出的结果并不相同。
987 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载