来自博客园开发团队开发前线最新消息:

在Entity Framework中,如果实体A关联了实体B,你想在加载实体A的同时加载实体B。通常做法是在LINQ查询中使用Include()。但是,如果你在查询条件中用到了实体B,EF会自动加载实体B,这时Include不仅是多余的,而且还会增加额外的LEFT OUTER JOIN查询,影响性能。

请看我们在博问开发中遭遇这个问题时的一段代码:

//For q.cnblogs.com
public class QuestionService
{private IRepository<QuestionItem> _questionRepository;public QuestionService(IUnitOfWork unitOfWork): base(unitOfWork){_questionRepository = new Repository<QuestionItem>(unitOfWork);}public List<QuestionItem> GetUnsolvedQuestions(int pageIndex, int pageSize){return _questionRepository.Entities.Include(q => q.User).Where(q => q.IsActive && q.User.IsActive).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();}
}public class QuestionItem
{public int Id { get;set; }public string Title { get; set; }public bool IsActive { get; set; }public int UserId { get; set; }public User User { get; set; }
}public class User
{public int UserId { get; set; }public bool IsActive {get;set;}
}

在上面的代码中,我们想在GetActiveQuestions()返回List<QuestionItem>时,QuestionItem中要包含User信息,所以在LINQ查询使用了.Include(q => q.User)。

(特别要注意的是:这里把q.User.IsActive作为查询条件之一)

然后我们用SQL Server Profiler发现,Entity Framework生成了如下的SQL语句:

SELECT TOP (25)
[Filter1].[Id] AS [Id],
[Filter1].[Title] AS [Title],
[Filter1].[UserId] AS [UserId],
[Filter1].[UserId1] AS [UserId1],
[Filter1].[IsActive1] AS [IsActive],
[Filter1].[UserId2] AS [UserId1],
[Filter1].[IsActive2] AS [IsActive1]
FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title],
[Extent1].[UserId] AS [UserId1],[Extent1].[IsActive] AS [IsActive1],
[Extent3].[UserID] AS [UserID2], [Extent3].[IsActive] AS [IsActive2],
row_number() OVER (ORDER BY [Extent1].[QID] DESC) AS [row_number]FROM   [dbo].[question_Item] AS [Extent1]INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserID] = [Extent2].[UserID]LEFT OUTER JOIN [dbo].[Users] AS [Extent3] ON [Extent1].[UserID] = [Extent3].[UserID]WHERE ([Extent1].[IsActive] = 1) AND ([Extent2].[IsActive] = 1)
)  AS [Filter1]
WHERE [Filter1].[row_number] > 0
ORDER BY [Filter1].[Id] DESC

[dbo].[Users]表对应的就是User实体类,上面的SQL中[dbo].[Users]出现了两次JOIN,由于[Users]表数据量比较大,两次JOIN影响了执行计划,查询耗时增加。这显然是要避免的。

在与这个问题一阵激战之后,我们终于找到解决方法 —— 去掉Include,就这么简单!

从这个地方看,Entity Framework还是挺聪明的,但是由于不知道它的这个聪明之处,反而带来了问题。

所以,代码如人,要和她相处好,就要了解她的一切!

原文:http://www.cnblogs.com/dudu/archive/2012/04/13/entity_framework_include_where.html

转载于:https://www.cnblogs.com/lenther2002/p/4614758.html

Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include相关推荐

  1. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序 2 ...

  2. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  3. Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  4. Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

    之前的两篇有关EF4.1的文章反响不错,感谢大家的支持!想体验EF4.1的新功能?RTW版本已经发布啦,http://www.microsoft.com/downloads/en/details.as ...

  5. Entity Framework学习三:查询、插入、更新和删除操作

    1.LINQ过滤数据  var query = from person in context.Peoplewhere person.FirstName.StartsWith("a" ...

  6. python条件查询 或 in_64.Python中ORM查询条件:in和关联模型

    定义模型的models.py文件中示例代码如下: from django.db import models class Category(models.Model): name = models.Ch ...

  7. 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...

    一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...

  8. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  9. Entity Framework技巧系列之二 - Tip 6 - 8

    提示6. 如何及何时使用贪婪加载 什么时候你需要使用贪婪加载? 通常在你的程序中你知道对查询到的实体将要进行怎样的操作. 例如,如果你查询一个订单以便为一个客户重新打印,你知道没有组成订单的项目即产品 ...

最新文章

  1. r语言 服务器网页版ide RStudio Server 简介
  2. 解决Android Device Chooser 找不到设备问题
  3. Linux中profile、bashrc、bash_profile之间的区别和联系
  4. jQuery的显示与隐藏
  5. String 字符串对象
  6. 标准开源产品是打破供应商垄断的关键
  7. NLP(新闻文本分类)——基于机器学习的文本分类
  8. C# break ,continue, return
  9. 多元线性回归(java实现)
  10. 通过js跳转url下载包含中文的文件乱码问题解决方案(java)
  11. Mybatis 别名机制,自动扫描 数据的增删改
  12. 解决Linux下chrome无法播放flash问题
  13. 双显卡笔记本安装linux,双显卡笔记本安装 Ubuntu 18.04 攻略
  14. [转]_int64、long long 的区别
  15. html控制word打印在一张页面,HTML文件到WORD文档双面打印三步曲
  16. win7系统什么时候停止服务器,Win7系统什么时候停止服务?Win7停止更新时间一览表图解...
  17. OpenCV - 汽车识别
  18. 小米 2021 秋招面试总结
  19. 关于项目外包的一些总结
  20. Java基础--object类详解

热门文章

  1. 泰克示波器查眼图_泰克示波器
  2. python的代码有哪些_Python有哪些有趣的代码呢,这些代码让
  3. 如何让鼠标跑不出来_洗衣机常年不清洗脏过马桶,教你一窍门,脏东西自己跑出来...
  4. AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
  5. java学习笔记2021.1.10
  6. java(4)——数据类型中的数值型的浮点数
  7. php tp 微信支付,PHP实现的微信APP支付功能示例【基于TP5框架】
  8. BT5下使用Armitage的一些问题
  9. 8.了解如何把vector和string数据传给旧的API
  10. Paxos、Raft分布式一致性算法应用场景