查询的原理

    以下是对每个查询过程的高级概述。

    1. LINQ 查询通过 Entity Framework Core 处理以构建即将传递给数据库提供程序的表示。

      • 处理结果会被缓存,这样的话就不用在每次查询时都进行处理
      • 识别到的查询的这些部分会被翻译为数据库特定的查询语言(例如,关系数据库的 SQL)
      • 一个或多个查询被发送到数据库,然后返回结果集(结果来自数据库,不是实体实例)
    2. 对于结果集中的每个项

      • 如果这是跟踪查询,EF 会验证数据是否表示上下文实例的变更跟踪器中的实体
        • 如果是,则返回已有的实体
      • 如果这是不跟踪查询,EF 会验证数据是否表示当前查询的结果集中的其他实体
        • 如果是,则返回已有的实体[1]
        • 如果不是,则创建和返回新实体

    [1] 无跟踪查询使用弱引用来保持跟踪已返回的实体实例。如果具有相同标识的之前的结果超出作用范围,则 GC 会执行回收,你可能会获得一个新的实体实例。

    查询时执行

    触发查询被发送到数据库的最通用操作包括:

    • 在 循环中对结果集进行迭代
    • 使用类似于 、、、 等的操作