首页 文章

何时sql查询的隐式顺序不是主键

提问于
浏览
0

在没有显式排序的情况下,linq-to-sql查询在哪种情况下会返回未按主键排序的项目?

(我知道SQL语句没有隐式顺序,获取定义顺序的正确方法是显式设置它)

例如:给定一个带有表 parent 的SQL数据库和一个表 children

表父有以下字段:

  • ID(int,主键,自动值,聚簇索引)

  • name(varchar)

表儿童有以下字段:

  • ID(int,主键,自动值,聚簇索引)

  • parentID(int,具有非聚簇索引的外键)

  • name(varchar)

使用linq-to-sql以下列方式访问:

var parent = dc.Parent.First(p=>p.ID==123);
...
foreach (var child in parent.Children)
    Console.WriteLine(child.ID)

据我所知,linq-to-sql只是在后台执行 select xy from Children Where parentID=123 ,但我不确定是否还有一些额外的缓存

在哪种情况下,child.IDs不会按升序排序?

如果我想保证订单,显然是这样做的正确方法
foreach (var child in parent.Children.OrderBy(c=>c.ID);
我意识到没有明确的OrderBy,订单是正式未定义的,并且不能依赖任何隐式排序 .

但是我有一些代码直到现在才使用显式命令,直到最近才通过所有测试,但现在偶尔会失败,我只是对原因感到好奇 .

1 回答

  • 0

    发生的事情可能是子表中数据的选择性发生了变化 . 这导致表格统计数据的变化,这将是对数据突然变化的顺序的解释 . 你很幸运,它碰巧按你想要的顺序排序,但保证某个顺序的唯一方法是使用显式的ORDER BY语句 .

相关问题