【问题标题】:How OrderBy happens in linq when all the records have the same value?当所有记录具有相同的值时,如何在 linq 中发生 OrderBy?
【发布时间】:2016-10-24 02:32:20
【问题描述】:

当 orderBy 发生在具有相同值的 datetime 上时,我在从 linqsql 的不同点击中得到不同的结果。

假设有 15 条记录与其字段之一具有相同的日期时间 如果这 15 条记录有分页,并且在我的情况下每页限制为 10,则说第 1 页的第一次运行有 10 条记录。那么对于第 2 页,我没有得到剩余的 5 条记录,但有 5 条记录来自第 1 页的前 10 条记录。

问题:

  1. orderBy 和 skip 和 take 函数的工作原理以及

  2. 为什么会出现这种差异?

【问题讨论】:

  • 这取决于 Linq 使用的查询机制的底层实现。 Linq 本身只是一个枚举扩展。您能否具体说明您的问题适用于哪个来源,例如MSSQL 或内存列表、OrderedLists 等?
  • 你能发布你的代码吗?
  • 它是 MSSQL @Wicher Visser
  • 我无法发布我的代码,但如果 orderby 列具有相同的值@Baldrick,所有 get 查询都会发生这种情况
  • 如果所有值都相同,则不保证排序。分页不能起作用,因为当再次执行相同的语句时,顺序很容易改变。因此,请确保您使用 另一个 tie-breaker 列进行排序

标签: c# sql-server entity-framework linq


【解决方案1】:

LINQ 不会影响如何应用对基础数据源的排序。 Linq 本身只是一个枚举扩展。根据您对问题的评论,您是在询问 MSSQL 如何在查询中应用排序。

在 MSSQL(和大多数其他 RDBMS)中,相同值的排序取决于 RDBMS 的底层实现和配置。这些值的排序结果可以被认为是随机的,并且可以在相同的查询之间发生变化。这并不意味着您会看到差异,但您不能依赖以特定顺序返回的数据。

之前已经在 SO,here 上询问并回答了这个问题。

community addon comments in this MSDN article 中也对此进行了描述。

【讨论】:

    【解决方案2】:

    没有应用超出 ORDER BY 子句中指定的排序。如果所有行都具有相同的值,则可以以最快的顺序返回它们。这在并行执行查询时尤其明显。

    这意味着您不能对按非唯一值排序的结果使用分页。每次您拨打电话时,订单都会更改。

    在这种情况下,您需要添加能够确保唯一排序值的分隔列,例如产品 ID ORDER BY Date, ProductID

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多