[英]Entity Framework performance of include
为了更好地理解“ Include
,这是一个技术性的问题(在EF的幕后)。
在末尾使用Select
语句时,是否会使查询更快以Include
另一个表?
ctx.tableOne.Include("tableTwo").Where(t1 => t1.Value1 == "SomeValueFor").Select(res => new {
res.Value1,
res.tableTwo.Value1,
res.tableTwo.Value2,
res.tableTwo.Value3,
res.tableTwo.Value4
});
它可能取决于另一个表中包含的值的数量吗?
在上面的示例中, included
表中有5个值中的4个。 我想知道它是否对性能有影响。 甚至好还是坏?
因此,我的问题是:EF在幕后做什么?在知道我之前会选择的所有值时,有没有使用Include
首选方法?
在您的情况下,是否使用Include(<relation-property-name>)
没有关系,因为您没有在Select(<mapping-expression>)
之前实现这些值。 如果使用SQL Server Profiler(或其他Profiler),则可以看到EF生成两个完全相同的查询。
原因是因为在Select
之前数据尚未在内存中实现-您正在处理IQueryable,这意味着EF将在最后生成SQL查询(在调用First()
, Single()
, FirstOrDefault()
, SingleOrDefault()
, ToList()
或在foreach
语句中使用该集合)。 如果在Select()
ToList()
之前使用ToList()
,它将把数据库中的实体具体化到您的内存中,当访问其他表的嵌套属性时,将使用Include()
进行N + 1查询。
这与您希望EF如何加载数据有关。 如果要预先填充“表”数据,则可以使用“包含”。 如果将更频繁地使用Include语句表,这将更加方便,并且由于EF必须事先加载所有相关日期,因此它会慢一些。 阅读延迟和渴望加载之间的区别。 通过使用Include,将成为预先加载数据的快速加载,而另一方面,当进行投影时,EF将向辅助表发送调用,即延迟加载。
我同意@Karamfilov的一般性讨论,但是在您的示例中,您的查询可能不是最有效的。 性能可能受到许多因素的影响,例如表上存在的索引,但是您必须始终帮助EF生成SQL。 Include
方法可以生成包含表中所有列的SQL,您应始终检查生成的SQL,并使用Join
验证是否可以获得更好的SQL。
本文介绍了可以使用的技术及其对性能的影响: https : //msdn.microsoft.com/it-it/library/bb896272(v=vs.110).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.