实体框架的性能包括

时间:2015-09-15 06:54:59

标签: c# sql performance entity-framework

对于我自己更好地理解Include来说,这更像是一种技术(EF的幕后)。

在最后使用Include语句时,它是否使Select另一个表的查询更快?

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
});

是否可能取决于另一个表中包含的值的数量?

在上面的示例中,5个值中的4个来自included表。我想知道它是否确实会对性能产生影响。即使是好的还是坏的?

所以,我的问题是:EF在幕后做什么,在知道我之前选择的所有值时,是否有任何首选方式使用Include

3 个答案:

答案 0 :(得分:1)

在您的情况下,如果您使用Include(<relation-property-name>)则无关紧要,因为您没有在Select(<mapping-expression>)之前实现值。如果您使用SQL Server Profiler(或其他分析器),您可以看到EF生成两个完全相同的查询。

原因是因为数据在Select之前未在内存中实现 - 您正在使用IQueryable,这意味着EF将在最后生成SQL查询(在调用First()之前,{ {1}},Single()FirstOrDefault()SingleOrDefault()或在ToList()语句中使用该集合。如果您在foreach之前使用ToList(),它会将数据库中的实体实现到您的内存中,Select()将在访问其他表的嵌套属性时不会进行N + 1查询

答案 1 :(得分:0)

这是关于您希望EF如何加载数据的。如果你想要A&#39;表&#39;要预先填充的数据比使用Include。如果更频繁地使用Include语句表会更加方便,因为EF必须事先加载所有相关日期,所以它会慢一些。阅读Lazy和Eager加载之间的区别。通过使用Include,它将是预先填充数据的热切加载,而另一方面,当投影发生时,EF将发送调用到辅助表,即使是延迟加载。

答案 2 :(得分:0)

我同意@Karamfilov的一般性讨论,但在您的示例中,您的查询可能不是最高效的。性能可能会受到许多因素的影响,例如表中存在的索引,但您必须始终帮助EF生成SQL。 Include方法可以生成包含表的所有列的SQL,您应该始终检查生成的SQL是什么,并验证是否可以使用Join获得更好的SQL。

本文介绍了可以使用的技术及其对性能的影响:https://msdn.microsoft.com/it-it/library/bb896272(v=vs.110).aspx