ome/img/nav3_on.png">
APP
系统平台
  • 建站知识
  • 联系我们
  • 咨询热线 :
    028-86922220

    疆括仕网站建设,新征程启航

    为企业提供网站建设、域名注册、服务器等服务

    LINQToSQL的一点讨论

    LINQ To SQL分页失败后会有什么结果呢?关于使用LINQ To SQL分页有什么需要注意的么?LINQ To SQL分页的实质是什么呢?那么本文就向你介绍具体的内容。

    从微软发布Linq To SQL依此,程序员围绕其与SqlDataAdapter等相比进行讨论,根据CSDN上的报道,LINQ比SqlDataReader落后的速度不超过10%。更加相信微软对Linq性能的分析会结合算法和统计结果来比较,对于linq查询性能--博客园的黄昕已经有所分析。于是产生想实验一下Linq和SqlDataAdapter等分别在大数据量下进行分页。园子里的Yzl的研究室已经对Linq分页可能出现的问题提出一种情况。(以下只是实验过程并非测试所以没有benchmark).

    LINQ To SQL分页实验步骤:LINQ To SQL分页之对于数据库:

    数据库名People;数据表名Prof 包括ID Name Age三个字段;记录数 10万条(也许不是很足够)下面的数据库代码并非最佳方案,大家贴一下自己的

     
     
     
    1.  
    2. CREATE DATABASE People  
    3. ON  
    4. Primary  
    5. (  
    6. NAME='people',  
    7. FILENAME='D:\people_Data.mdf',  
    8. SIZE=10,  
    9. FILEGROWTH=10%  
    10. )  
    11.  
    12. LOG ON  
    13. (  
    14. NAME='peoplelog',  
    15. FILENAME='D:\people_Log.ldf',  
    16. SIZE=10,  
    17. FILEGROWTH=10%  
    18. )  
    19. GO  
    20. USE People  
    21. CREATE TABLE Prof  
    22. (  
    23. ID INT IDENTITY(1,1) NOT NULL,  
    24. Name NVARCHAR(100) COLLATE Chinese_PRC_CI_AS NULL ,  
    25. Age INT NULL,  
    26. )  
    27.  
    28. GO  
    29.  
    30.   SET IDENTITY_INSERT Prof ON  
    31.  DECLARE @i INT,@age INT  
    32.  SET @i=1  
    33.  WHILE @i<=100000  
    34.  BEGIN  
    35.   SET @age=CAST((RAND()*(100-20)+20)AS INT)  
    36.   INSERT INTO Prof(ID,Name,Age)  
    37.  VALUES(@i,'Name_'+ CAST(@age AS NVARCHAR),@age)  
    38.   SET @i=@i+1  
    39.  END  
    40. SET IDENTITY_INSERT Prof OFF  

    测试代码一(SQL部分):

    网上已经有很多非常好的分页算法,各人按照设计的需要选择合适的为好,特别提一下Thin的算法(很简洁),测试中采用了李洪根发布的其中一种分页算法

    DivPage

     
     
     
    1. //省略行参数设置和拼接  
    2. string strcmd = "SELECT TOP 20 * " +  
    3. "FROM Prof " +  
    4. "WHERE (ID >" +  
    5. "(SELECT MAX(ID) FROM (  
    6.  
    7. SELECT TOP 60000 id FROM Prof ORDER BY id) AS T))  ORDER BY ID";  

    显示查询耗时:00:00:00.0322245

    测试代码二(Linq部分)

    Linq To SQL的分页主要通过Skip和Take操作符实现,代码如下:

     
     
     
    1. //省去设置参数  
    2. //分页Skip(PageSize * PageIndex).Take(PageSize)  
    3. PeopleDataContext dc = new PeopleDataContext();  
    4. var query =   
    5. (from p in dc.Prof select p).Skip(60000).Take(20); 

    然而却出现异常:此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip(),这种查询为单表(非联接)查询,或者为 Distinct、Except、Intersect 或Union (非 Concat)操作。第一次遇到这种异常(当然很多朋友并不会,而且已经看出问题所在了),查找Skip的定义

     
     
     
    1. public static IEnumerable Skip(  
    2. this IEnumerable source,  
    3. int count  

    此方法通过使用延迟执行实现。即时返回值为一个对象,该对象存储执行操作所需的所有信息。只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。再看一下该查询生成的SQL代码:

     
     
     
    1. SELECT TOP 20 [t0].[ID], [t0].[Name], [t0].[Age]  
    2. FROM [dbo].[Prof] AS [t0]  
    3. WHERE NOT (EXISTS(  
    4. SELECT NULL AS [EMPTY]  
    5. FROM (  
    6. SELECT TOP 60000 [t1].[ID]  
    7. FROM [dbo].[Prof] AS [t1]  
    8. ) AS [t2]  
    9. WHERE [t0].[ID] = [t2].[ID]  
    10. )) 

    Skip查询需要数据标识列提供查询的根据,是否可以假设Skip是通过标识列的唯一性来逐一返回对象的呢?
    修改数据库People表Prof,设置其ID为主键,(上面的数据库相应修改为)

     
     
     
    1.  ALTER TABLE Prof  
    2. ADD CONSTRAINT PK_ID PRIMARY KEY (ID)  
    3. GO 

    再次运行,显示查询耗时:00:00:00.0478485

    LINQ To SQL分页问题的提出

    1.为什么两次查询的耗时相差那么大呢?(估计是个人机器以及代码问题:))

    2.Skip是否通过主键的唯一性逐次返回查询对象?

    LINQ To SQL分页总结:

    SQLServer的执行效率是按照语义来执行的,也许Linq在性能上不一定和SQLDataAdapter等完全一样,但是在开发效率上,我们可以看出Linq的实现代码的简易性是相对较好的,只要克服其中的一些问题,相信Linq会为以后的数据查询提供更强大帮助!

    LINQ To SQL相关的内容就向你介绍到这里,希望对你了解和学习LINQ To SQL有所帮助。

    【编辑推荐】

    1. LINQ查询方式的探寻
    2. LINQ查询的效果分析
    3. LINQ查询和泛型类型的关系浅析
    4. LINQ动态查询的实现浅析
    5. LINQ TO SQL动态修改表名称的实现浅析

    文章题目:LINQToSQL的一点讨论
    浏览路径:https://www.tyhkzb.com/article/cocsjgd.html
    在线咨询
    服务热线
    服务热线:028-86922220
    TOP