首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架核心查询生成

实体框架核心查询生成
EN

Stack Overflow用户
提问于 2022-06-23 16:52:43
回答 2查看 217关注 0票数 4

相关话题:Entity framework performance tuning

Entity Framework Core总是生成性能最好的查询吗?是否有一个Counter-Example (EF查询的性能低于原始SQL查询(EF生成一个SQL查询,我们可以更好地使用原始SQL编写它)?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-03 08:59:41

好吧,有一个案子可能真的很突出。当Include()-ing是一个集合时,EF总是生成外部联接。如果我们事先知道没有孩子的父母不存在(或者我们不需要他们),就无法指示EF为Include生成内部连接,而外部(最差)和内部连接(最好)之间可能有很大的性能差异。

对我来说,这已经够烦人的了,让我不得不使用coin an IncludeInner方法,不幸的是,这个方法被拒绝了(而且,公平地说,我没有提交拉请求)。

从EF的角度来看,生成外部联接是有意义的。毕竟,像.

代码语言:javascript
复制
context.Parents.Include(p => p.Children)

...is希望把所有的父母都送回去,而不仅仅是那些有孩子的父母。

因此,如果我们对有孩子的独生子女父母感兴趣,我们必须恢复到这样的查询:

代码语言:javascript
复制
context.Parents.Include(p => p.Children)
    .Where(p => p.Children.Any()

现在我们有了一个OUTER JOIN和一个EXISTS谓词,它们都可以访问子表。如果性能非常关键,我们只能自己编写带有内部联接的SQL,或者使用join语句编写LINQ,而不是使用导航特性。

值得注意的是,与早期版本和esp相比,EF核心的查询生成总体上有了很大的改进。实体框架6(用于.net框架)。虽然EF6是可悲的,但我敢说EF6 6是现在最好的之一.(尽管GroupBy支持仍然是一个问题)。

票数 2
EN

Stack Overflow用户

发布于 2022-07-01 10:59:39

简短的回答是No

解释

EFCore ()并不是为了生成性能更好的查询,EFCore的目标仅仅是根据您提供的模型生成查询。EFCore将根据您试图实现的结果创建正确的查询。

查询只根据所涉及的导航属性和外键生成。

数据库主要使用索引统计信息来生成最佳查询计划,这与使用EFCore或普通SQL编写查询无关。

无论使用EFCore编写查询的方式如何,server都将始终选择最有效的计划。

拆分查询

EFCore提供了查询拆分,与旧的实体框架生成的单个查询中的许多联接相比,这导致了较小的数据集。

您可以在这里看到它:https://learn.microsoft.com/en-us/ef/core/querying/single-split-queries,它肯定比以前的实体框架更快。

我们已经看到使用拆分查询的查询时间从2秒下降到了20 We。有非常小的不一致,因为两者都发生在不同的时间,实际上是执行了许多单独的查询。但在很大程度上,它是足够和快速的。最好的部分是您可以使用.AsSingleQuery()来使用单个查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72733930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档