Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include
来自博客园开发团队开发前线最新消息:
在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
Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include的更多相关文章
- Entity Framework Code First添加修改及删除外键关联实体
1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...
- [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)
http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可 ...
- 关于MySql entity framework 6 执行like查询问题解决方案
原文:关于MySql entity framework 6 执行like查询问题解决方案 本人不善于言辞,直接开门见山 环境:EF6.0.0.0+MySQL Server5.6+MySqlConnec ...
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (一)
EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...
- Entity Framework 基于方法的查询语法
实体框架(Entity Framework )是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术. LINQ to Entities 提供语言集成查询 (LINQ) 支持,它允许开发 ...
- 一个Entity Framework、ADO.NET查询性能测试
Entity Framework自然是会比ADO.NET性能慢点,这个不多说了.直接上结果. 本该用测试项目的,不过我建了个aspx.下面是随便测20遍得到的结果 补充!!把12行改成 list = ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...
- Entity Framework Core For MySql查询中使用DateTime.Now的问题
背景 最近一直忙于手上澳洲线上项目的整体迁移和升级的准备工作,导致博客和公众号停更.本周终于艰难的完成了任务,借此机会,总结一下项目中遇到的一些问题. EF Core一直是我们团队中中小型项目常用的O ...
随机推荐
- linux硬件时间修改与查看
linux修改时间和日期.查看修改硬件时间 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel中的 ...
- linux 下查找大于100M的文件
命令行如下 find . -type f -size +100M Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢?以易读 ...
- CCF 201403-1 相反数 (水题)
问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). 第二行为 N 个用单 ...
- HDU 5703 Desert (找规律)
题意:一杯水有n的容量,问有多少种方法可以喝完. 析:找规律,找出前几个就发现规律了,就是2的多少次幂. 代码如下: #include <cstdio> #include <stri ...
- poj - 3683 - Priest John's Busiest Day(2-SAT)
题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...
- xib上拖拽scrollview的自动布局方法
http://www.cocoachina.com/ios/20150104/10810.html
- spring+jpg环境下,spring实现文件上传
jsp: <form method="post" action="excel.do?method=inputExcel" enctype="mu ...
- ELF学习--重定位文件
add.c int data = 1;int bss;const int rodata = 1;int add(int num1, int num2){ int sum = 0; sum = num1 ...
- SqlServer数据维护
现有两个表:Code和CodeCategory Code表: CodeCategory表: 现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与Pla ...
- 检测一个DOM对象是否为空
我们时常要检测一个DOM对象是否为空. var $jObject = $('#btn'); alert($jObject ); 我们会发现,$jObject 永远不会为空.为什么呢?$ 方法查找对象, ...