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