如何解决DbSet中的项目顺序是否与Entity Framework Core中数据库表中的行顺序匹配?
例如,我有一个具有表 Clients 的 Postgres 数据库,其中主键为 INT ,行自然地通过按升序进行排序ID 。我有 .Net Core 应用程序,其中 Entity Framework Core 作为ORM,而 Npgsql 作为数据提供者。主要问题:
- 此清单的返回集合中的项目顺序是否总是与数据库中原始表中的行顺序匹配?
var clients = context.Clients.ToList();
- 在没有 OrderBy()的情况下,是否将 Take()应用于 DbSet 总是从表的开头按正确的顺序返回项目?
- 在没有 OrderBy()的情况下,将 Skip()应用于 DbSet 总是会以正确的顺序从表的开头跳过项目吗? li>
- 这些列表是否相等?
var clients = context.Clients
.Skip(10)
.Take(5)
.ToList();
var clients = context.Clients
.OrderBy(c => c.Id)
.Skip(10)
.Take(5)
.ToList();
- 当我要对表进行分页时,是否必须始终在带有 Skip()和 Take()的表达式中使用 OderBy()?
- 所有这些行为是由框架还是由数据提供者确定的?例如,在 MSSQL , Postgres 和 MySql 中,这些内容是否相同?
解决方法
表中没有固有的顺序,它们可以按照聚簇索引的顺序进行物理存储,但是除非您指定排序,否则引擎可以按照认为适合的任何顺序将它们返回给您,以实现性能和/或一致性。订单。
原始规范(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)表示:
如果未指定order by子句,则 Q的行与实现有关。
您不应该依赖于依赖于实现的细节,因为它们容易发生变化。
所以基本上是-您必须指定一个订单。不,他们不一样。是的,您需要订购者才能使用跳过或接受。并且由提供商和框架共同决定,即使是在同一版本上运行,两者也不可依靠这种方式。仅仅因为您多次获得期望的结果,并不意味着这种情况将继续发生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。