DbSet 中的项目顺序是否与 Entity Framework Core 中数据库 table 中的行顺序匹配?

Does the order of items in DbSet match the order of rows in the database table in Entity Framework Core?

例如,我有一个 Postgres 数据库和 table Clients,其中主键是 INT 并且行按 Id 的升序自然排序。我有 .Net Core 应用程序,其中 Entity Framework Core 作为 ORM 和 Npgsql 作为数据提供商。所以主要问题:

  1. 此列表的 returned 集合中的项目顺序是否始终与数据库中原始 table 中的行顺序匹配?
    var clients = context.Clients.ToList();
  1. 如果 Take() 应用于 DbSet 而没有 OrderBy() 将始终 [= table 开头的 75=] 项顺序正确?
  2. 是否将 Skip() 应用于 DbSet 而没有 OrderBy() 将始终跳过项目从 table 开始的顺序正确吗?
  3. 这些列表是否相同?
    var clients = context.Clients
        .Skip(10)
        .Take(5)
        .ToList();
    var clients = context.Clients
        .OrderBy(c => c.Id)
        .Skip(10)
        .Take(5)
        .ToList();
  1. 我是否必须始终在 Skip()Take()[ 的表达式中使用 OderBy() 当我想分页时 table?
  2. 所有这些行为是由框架决定的还是由数据提供者决定的?例如,这些东西在MSSQLPostgresMySql中是否相同?

在table中没有固有的顺序,它们可能在物理上按照聚集索引的顺序存储,但是引擎可能return它们以任何它认为适合的顺序给你实现性能 and/or 一致性,除非您指定排序顺序。

原始规范 (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 说:

If an order by clause is not specified, then the ordering of the rows of Q is implementation-dependent.

您不应依赖 implementation-dependent 细节,因为它们很容易发生变化。

基本上是的 - 您必须指定订单。不,他们不一样。是的,你需要一个 orderby 来使用 skip 或 take。它由提供者和框架决定,两者都不能依赖保持这种方式,即使在同一版本 上运行。仅仅因为您多次按预期顺序获得结果,并不意味着这种情况会继续发生。