LINQ to Entity是用于查询和管理数据库的极好的ORM。 它提供了很多东西,所以必须了解它的性能。LINQ在某一些地方有它自己的坏处。 在使用Entity Framework ORM设计和查询数据库时,我们应该记住一些提示和技巧。

  • 避免将所有DB对象放入一个单一实体模型中

  实体模型指定了单个工作单元,而不是我们所有的数据库。如果我们有很多数据库对象没有彼此连接,或者这些(日志表,批处理进程使用的对象等)根本不被使用。因此,这些对象正在消耗内存中的空间并导致性能下降。所以尝试制作相关数据库对象的独立实体模型。

  • 如果不需要,禁用实体的更改跟踪

  每当您检索数据仅用于阅读目的时,不要进行修改,因此不需要对象跟踪。 因此,通过使用MergeOption禁用对象跟踪,如下所示:

1 NorthwindDataContext context = new NorthwindDataContext();
2 context.tblCities.MergeOption = MergeOption.NoTracking; 

  此选项允许我们关闭对象缓存和对象不必要的标识管理。

  • 使用“预生成视图”可以减少首次请求的响应时间

  当ObjectContext的对象在应用程序中第一次创建时,实体框架将创建一组访问数据库所需的类。 这组类称为视图,如果您的数据模型很大,则创建视图可能会延迟Web应用程序对页面的第一个请求的响应。 我们可以通过使用T4模板或EdmGen.exe命令行工具在编译时创建视图来减少此响应时间。

  • 如果不需要,避免提取所有字段

  避免从数据库中获取不需要的字段。 假设我有20个字段的Customer表,我只对三个字段感兴趣,即CustomerID,Name,Address,然后只读取这三个字段,而不是提取Customer表的所有字段。

  

 1 // 不好的实践
 2 var customer =
 3 (from cust
 4 in dataContext.Customers
 5 select cust
 6 ).ToList();
 7
 8 // 最佳实践
 9 var customer =
10 (from cust
11 in dataContext.Customers
12 select new {
13     customer. CustomerID,
14     customer.Name,
15     customer.Address
16  }). ToList (); 

  • 为数据操作选择适当的集合

  在LINQ我们有var,IEnumerable,IQueryable,IList类型的集合用于数据操作。每种集合对查询都有重要作用和性能影响,因此请小心使用这些集合进行数据操作。为了学习所有这些集合之间的差异,请参考文章:IEnumerable VS IQueryable , IEnumerable VS IList ,Var VS IEnumerable 。

  • 在需要的地方使用编译查询

  如果经常用于从数据库获取记录,则对已编译的查询进行查询。这个查询在第一次很慢,但之后它显著地提高了性能。 我们使用CompiledQuery类的编译方法进行编译查询。假设您需要基于城市一次又一次地检索客户详细信息,然后将此查询编译为已编译的查询,如:

 1 // 创建实体对象
 2 NorthwindEntities mobjentity = new NorthwindEntities();
 3  // 简单查询
 4 IQueryable lstCus = from customer in mobjentity.tblCustomers
 5 where customer.City == "Delhi"
 6 select customer;
 7
 8 // 编译查询
 9 Func> compiledQuery
10 = CompiledQuery.Compile >
11 (
12     (ctx, city) => from customer in ctx.Customers
13                 where customer.City == city
14                 select customer
15 ); 

在上面的查询中,我们传递string类型的参数city来过滤记录。

  • 仅检索所需数量的记录

  当我们将数据绑定到Grid或进行分页时,仅检索所需的记录数以提高性能。 这可以通过使用Take,While和Skip方法来实现。如下所示的分页:

1  // 创建实体对象
2 NorthwindEntities mobjentity = new NorthwindEntities();
3 int pageSize=10,startingPageIndex=2;
4 List lstCus = mobjentity.tblCustomers.Take(pageSize)
5                                      .Skip(startingPageIndex * pageSize)
6                                      .ToList(); 

  • 避免使用Contains方法

  在LINQ中,我们使用Contains方法检查数据是否存在。 但它在SQL中转换为“WHERE IN”,导致性能下降。

  • 避免在数据库中使用视图

  视图降低了LINQ查询性能。 它们性能较差,对LinQ性能影响很大。 所以避免在LINQ to Entities中使用视图。

  • 调试和优化LINQ查询

  如果要调试和优化查询,那么LINQ Pad是一个很好的工具。  对查询构造,调试和优化非常有用。

1 IQueryable lstCus = from customer in mobjentity.tblCustomers
2                     where customer.City == "Delhi"
3                     select customer;
4 lstCus.Dump(); 

  LINQ Pad的Dump方法在结果窗口中提供上述查询的结果。

转载于:https://www.cnblogs.com/WinHEC/articles/tips-to-improve-entity-framework-performance.html

提高Entity Framework性能的一些建议相关推荐

  1. ADO.net,Linq to SQL和Entity Framework性能实测分析

    [测试总结] 第一阶段测试结果非常出人意料,ADO.net和LINQ to SQL操作数据的时间都控制在0.5秒以内,非常的迅速,但是Entity Framework在添加这步表现非常差,由于这五步是 ...

  2. 彻底征服 Entity Framework Core 优化!

    作者 | 喵叔 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 这篇文章我们来讲解一下 Entity Framework Core 的优化方案.Entity Framework Cor ...

  3. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL 和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist  C ...

  4. MapReduce: 提高MapReduce性能的七点建议【译】

    2019独角兽企业重金招聘Python工程师标准>>> 作者是通过这个网站翻译过来的: http://blog.cloudera.com/blog/2009/12/7-tips-fo ...

  5. 提高WPF程序性能的几条建议

    原文:提高WPF程序性能的几条建议 这篇博客将介绍一些提高WPF程序的建议(水平有限,如果建议有误,请指正.) 1. 加快WPF程序的启动速度: (1).减少需要显示的元素数量,去除不需要或者冗余的X ...

  6. Entity Framework Core 6.0 预览4 性能改进

    起因 微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework  ...

  7. Entity Framework 学习建议及自学资源

    Entity Framework 学习建议及教学PPT 金旭亮 =============================================== EntityFramework(EF)是 ...

  8. 提高 Web 应用性能的10条建议

    转载:http://www.devstore.cn/essay/essayInfo/6193.html?ref=myread 提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长: ...

  9. Entity Framework part2

    EF原理 以XML方式打开edmx文件,这个XML的文件主要包含两大部分:Runtime是类模型部分,Designer是VS中的图形界面 重点讨论的是Runtime部分,又分为三大部分: SSDL数据 ...

最新文章

  1. hibernate mysql 存储过程_hibernate调用mysql存储过程
  2. 16、修改数据表的存储引擎
  3. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第三章——自编解析与答案
  4. HDU - 2732 Leapin' Lizards(最大流+思维建边)
  5. 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
  6. 解析markdown_markdown-it 原理浅析
  7. Java 两个复数求和
  8. 从中台、数仓与元数据不为人知的3个角度,看数据管理的生与死
  9. 软件测试,从零开始:测试新手入门必读
  10. Windows 用户和内核模式
  11. 北京大学计算机语言学,北京大学计算语言学教育部重点实验室
  12. 【财务_会计3_1】会计科目的概念
  13. 剑客之剑——倚天剑(Vim)
  14. IT痴汉的工作现状23-乡关何处
  15. 如何搭建易企秀H5平台?
  16. 使用cmd命令远程重启服务器
  17. 【CSS如何画简单的三角形或者梯形】
  18. 7-1 页面置换算法--FIFO (50 分)(思路详解)
  19. 【机器学习数据集】如何获得机器学习的练习数据?
  20. 第三节 树莓派EC20之PPP拨号上网

热门文章

  1. [转]linux权限补充:rwt rwT rws rwS 特殊权限
  2. Python sysos模块
  3. (转)iOS 常用宏定义
  4. System.Management.ManagementException: 访问遭到拒绝的解决方案
  5. 【体系结构】shared pool的个人理解
  6. 机器学习——Day 1 数据预处理
  7. 360安全卫士v3.0beta3版发布!
  8. 微积分28-复合函数与隐函数的微分法
  9. Asp.Net中备份还原SqlServer数据库
  10. 978. 最长湍流子数组