在什么情况下,没有显式排序的 linq-to-sql 查询会返回未按主键排序的项目?
(我知道 SQL 语句没有隐式顺序,并且获得定义顺序的正确方法是显式设置它)
例如:给定一个带有 tableparent
和 table的 SQL 数据库children
:
表父具有以下字段:
- ID(int、主键、自动值、聚集索引)
- 名称(varchar)
表儿童具有以下字段:
- ID(int、主键、自动值、聚集索引)
- parentID(int,具有非聚集索引的外键)
- 名称(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
在后台执行 a ,但我不确定中间是否有一些额外的缓存
什么情况下child.ID不会升序排序?
如果我想保证订单,正确的做法显然是
foreach (var child in parent.Children.OrderBy(c=>c.ID);
我意识到没有明确的 OrderBy 订单是官方未定义的,不能依赖任何隐式排序。
但是,我有一些代码直到现在才使用显式顺序,并且直到最近才通过所有测试,但现在偶尔会失败,我只是对原因感到好奇。