LINQ-to-SQL那点事~关于延时加载的性能,微软给出了不错的解决方案

简介:

 LINQ-to-SQL虽然已经属于过去事了,但由于历史原因,还是要关注一下它,呵呵,当微软推出linq to sql之后,最吸引开发者的地方可能就是可视化的数据模型灵活可控的分部方法神神秘秘的延时加载了,呵呵!今天主要再总结一个linq to sql中的延时加载!

对于数据上下文DataContext来说,它有一个属性叫做DeferredLoadingEnabled,它的默认值为true,意思是开启模型的延时加载功能,例如:当你有一个对象Order_info,它有关系表Order_Detail,它们之间为一对多的关系,这在dbml模型中用EntitySet<T>来表示,意为实体的集合。而开启模型的延时加载功能时,只要你查询出Order_Info后,如果在前台使用到了Order_Detail,系统就会将Order_Detail的相关数据也查询出来,听上去不错,看代码:

@foreach (var item in Model)
{ 
    <p>
        @item.OrderID
        @item.CreateDate
    </p>
   if (item.Order_Detail.Count > 0)
   {
       foreach (var detail in item.Order_Detail)
       { 
    <p style="margin: 10px;">@detail.OrderID @detail.ProductName</p>
       }
   }
}

产生的SQL代码:

注意,当前台对Order_Detail有需要时,系统会产生查询Order_Detail的代码,如果你的10条Order_Info记录,那么,系统会向SQLSERVER发送10条语句
,这让我们感觉到了一点坏味道,没错,使用延时加载不但没有提高性能,反尔加大了数据库的交互,事实上,我可能不是微软的本意,可能是我们误会了DeferredLoadingEnabled的用意,呵呵!

DeferredLoadingEnabled使用场合:对于单条记录可以使用,对于集合对象不应该使用它

Linq To Sql对于集合对象的导航属性进行延时加载,提供了自己的解决方案

小插曲,一般我们建立DBML模型后,如果希望改它的代码部分我们一般不会在原文件上改,因为重新生成数据模型后,你改的代码就被覆盖了,而我们的做法是新建一个类文件,它与DBML模型文件的数据上下文对象同名(微软为我们建立的上下文类是partial的,人家已经为咱们预留出接口了,呵呵),如果希望在数据上下文被建立时执行代码,可以在分部方法OnCreate里作文章(注意默认构造方法已经被原类占用,所以你的分部类不能再定义一个空构造方法了,呵呵)。

DataLoadOptions 对象为我们提供了立即加载模式,它所产生的SQL语句是我们可以接受的,但它不会按需查询了,即将order_info和order_detail进行join

查询并直接返回数据,呵呵。

这种方法只在分部方法OnCreate中定义即可,你的DAL实现层,BLL业务组合层,WEB展现层的代码都不用调整,呵呵。

     partial void OnCreated()
        {
            // this.DeferredLoadingEnabled = false;//关闭延时加载
            #region 优化后的延时加载,对某个对象进行延时加载
            DataLoadOptions dl = new DataLoadOptions();
            dl.LoadWith<Order_Info>(p => p.Order_Detail);
            this.LoadOptions = dl;
            #endregion

        }

而这种立即加载所产生的SQL语句是我们可以接受的,看图:

它解释成的SQL语句也是我们熟悉的,看代码:

SELECT [t0].[OrderID], [t0].[UserID], [t0].[CreateDate], [t1].[OrderDetailID], [t1].[OrderID] AS [OrderID2], [t1].[ProductID], [t1].[ProductName], (
    SELECT COUNT(*)
    FROM [dbo].[Order_Detail] AS [t2]
    WHERE [t2].[OrderID] = [t0].[OrderID]
    ) AS [value]
FROM [dbo].[Order_Info] AS [t0]
LEFT OUTER JOIN [dbo].[Order_Detail] AS [t1] ON [t1].[OrderID] = [t0].[OrderID]
ORDER BY [t0].[OrderID], [t1].[OrderDetailID]

恩,看来linq to sql知所以性能低下,不是它本身的问题,而是我们对它不够了解呀,呵呵!

相关文章:EF架构~对不起Include,是我冤枉你了!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:LINQ-to-SQL那点事~关于延时加载的性能,微软给出了不错的解决方案,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
SQL 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
|
2月前
|
SQL 监控 数据库
MSSQL性能调优实战策略:索引优化、SQL语句重构与并发控制
在Microsoft SQL Server(MSSQL)的管理和优化过程中,性能调优是确保数据库高效运行、满足业务需求的重要环节
|
2月前
|
SQL 运维 监控
MSSQL性能调优实战:索引优化、SQL查询效率提升与并发控制策略
在Microsoft SQL Server(MSSQL)的日常运维与性能优化中,精准的策略与技巧是实现高效数据库管理的关键
|
2月前
|
SQL 存储 数据库
MSSQL性能调优实战:索引优化、SQL语句精调与高效并发处理
在Microsoft SQL Server(MSSQL)的性能调优征途中,索引优化、SQL语句的精细调整以及高效并发处理是三大核心策略
|
2月前
|
SQL 监控 数据库
MSSQL性能调优实战技巧:索引优化策略、SQL查询重构与并发控制详解
在Microsoft SQL Server(MSSQL)的管理与优化过程中,性能调优是确保数据库高效运行的关键环节
|
2月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
21天前
|
SQL 数据处理 数据库
专坑同事的SQL写法:性能杀手揭秘
【8月更文挑战第29天】在日常的数据库开发与维护工作中,编写高效、清晰的SQL语句是每位数据工程师的必修课。然而,不当的SQL编写习惯不仅能降低查询效率,还可能给同事的工作带来不必要的困扰。今天,我们就来揭秘八种常见的“专坑同事”SQL写法,助你避免成为那个无意间拖慢整个团队步伐的人。
28 1
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL 慢查询秘籍】慢SQL无处遁形!实战指南:一步步教你揪出数据库性能杀手!
【8月更文挑战第24天】本文以教程形式深入探讨了MySQL慢SQL查询的分析与优化方法。首先介绍了如何配置MySQL以记录执行时间过长的SQL语句。接着,利用内置工具`mysqlslowlog`及第三方工具`pt-query-digest`对慢查询日志进行了详细分析。通过一个具体示例展示了可能导致性能瓶颈的查询,并提出了相应的优化策略,包括添加索引、缩小查询范围、使用`EXPLAIN`分析执行计划等。掌握这些技巧对于提升MySQL数据库性能具有重要意义。
53 1
|
19天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
34 0
|
19天前
|
SQL 存储 监控