按smalldatetime排序字段在SQL server和C#(实体框架)中产生不同的结果

按smalldatetime排序字段在SQL server和C#(实体框架)中产生不同的结果,c#,sql-server,entity-framework,datetime,C#,Sql Server,Entity Framework,Datetime,我有一个带有字段LastChange的表,其类型为smalldatetime。当我在此字段上按升序排序时,我得到以下结果: 我已经在实体框架中创建了一个与此对应的实体。LastChange字段的类型是DateTime 当我执行相同的排序操作时,如下所示: teams.OrderBy(x => x.LastChange).Select(x => x.TeamID) 我得到以下结果: [0]: 158 [1]: 161 [2]: 159 [3]: 160 [4]: 165 [5]:

我有一个带有字段LastChange的表,其类型为
smalldatetime
。当我在此字段上按升序排序时,我得到以下结果:

我已经在实体框架中创建了一个与此对应的实体。
LastChange
字段的类型是
DateTime

当我执行相同的排序操作时,如下所示:

teams.OrderBy(x => x.LastChange).Select(x => x.TeamID)
我得到以下结果:

[0]: 158
[1]: 161
[2]: 159
[3]: 160
[4]: 165
[5]: 163
[6]: 166
[7]: 167
[8]: 168
[9]: 169
[10]: 170
[11]: 171
[12]: 1172
[13]: 162
[14]: 164
[15]: 172
为什么这两个结果不同?是否因为多条记录的
LastChange
值相同?或者这与
smalldatetime
类型有关?

这两个结果都是正确的。 您需要排序顺序,只能按“LastChange”列排序。由于LastChange列的精确性(以分钟为单位),您将获得正确的结果。在您选择的示例中,Sql或c#不需要考虑其他数据。
Eather为LastChange列添加二阶参数或增加输入进动。

这是因为LastChange字段在多行中完全相同。试试这些:

SELECT *
FROM YourTable
ORDER BY LastChange, TeamID;

teams.OrderBy(x => x.LastChange).ThenBy(x => x.TeamID).Select(x => x.TeamID)
在这两个地方,您将获得完全相同的结果。如果不指定第二个字段的顺序,SQL将显示随机结果(对于未指定的字段),通常是相同的,但可以完全不同

是否因为多条记录的LastChange值相同

对。在排序LastChange后,c#和数据库都不会尝试对结果进行进一步排序,因此对于相同的LastChange的任何值,该集中的行可以是任意顺序,不会有一致性-总有一天它们会这样排序,稍后,如果数据库重新组织了表中的数据,它们将具有不同的顺序。C#很可能会以完全不同的方式排序,这是排序算法其余部分工作方式的一个副作用。无法保证db和c总是以相同的方式排序;他们每个人都会放弃,因为在最后一次改变中,排序是尽可能好的

如果您总是希望数据按特定顺序排列,则必须对其进行精确排序。如果数据本身没有任何一致的排序依据,那么您必须编写自己的排序系统,或者提供额外的数据

例如,如果我们总是希望此数据来自仅包含名称的db表:

Tim
James
John
它不是按字母顺序,逆字母顺序,按第二个字符的字母顺序,也不是按长度排序,等等。我们无法根据数据本身对这些数据进行排序,因此我们必须:

ORDER BY 
  CASE personname
    WHEN 'Tim' THEN 0
    WHEN 'James' THEN 1
    WHEN 'John' THEN 2
  END
在这里,我们将数据转换成可排序的东西

TLDR;如果您总是希望以某种方式对数据进行排序,则必须是每行特定的。排序依据的列的组合必须是唯一的。只要按一组非唯一的列进行排序,相同的数据就可能以任何不一致的随机顺序出现

或者这与smalldatetime类型有关


不,它会影响正在排序的所有数据集,其中多行具有相同的值,并且没有任何东西可以进一步帮助排序算法选择相同行中的哪一行应该先排序

Thank@CaiusJard