繁体   English   中英

实体框架的表现包括

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM