实体框架编译的查询容器?

问题描述 投票:0回答:1

我认为以下是一个好主意,在这种情况下,这里的人可能可以向我指出实现它的代码。或者是一个愚蠢的想法,在这种情况下,有人会解释原因并避免我浪费时间。

是否可以为我的每个实体框架查询创建一个容器,在第一次调用它时,查询将被编译并执行。然后在随后的时间里,它调用现在已经编译的查询?

最好是在使用它的方法中直接内联创建它,这样它在很大程度上是不可见的(使得制作查询类似于不使用此容器)?

c# entity-framework entity-framework-core
1个回答
0
投票

LINQ 翻译内部如何工作:

标准行为:

  1. 翻译器检查缓存中是否有类似表达式树的现有翻译。
  2. 如果找到,它将使用缓存的 SQL 和映射器来执行具有给定参数的查询。
  3. 如果没有,它会翻译 LINQ 表达式,生成 SQL 和映射器,缓存它们,然后执行查询。

编译查询行为:

  1. 翻译器检查字段是否有预编译翻译。
  2. 如果找到,它将使用预编译的 SQL 和映射器来执行具有给定参数的查询。
  3. 如果没有,它会翻译 LINQ 表达式,生成 SQL 和映射器,将它们存储在 field 中,然后执行查询。

这些算法之间的主要区别在于,编译的查询不会在缓存中搜索表达式树的现有翻译,而仅在字段中查找。根据缓存状态和表达式树复杂性,搜索缓存的成本可能很高 - 请参阅 ExpressionEqualityComparer 了解如何比较表达式。

这就是为什么编译查询更快。

您想要做的是复制标准行为,这需要再次搜索缓存。这在当前的 EF Core 实现中没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.