0

在什么情况下,没有显式排序的 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 订单是官方未定义的,不能依赖任何隐式排序。

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

4

1 回答 1

0

发生的情况可能是子表中数据的选择性发生了变化。这会导致表的统计数据发生变化,这可以解释数据顺序突然变化的原因。您只是很幸运,它碰巧按照您之前想要的顺序对事物进行了排序,但是保证特定顺序的唯一方法是使用显式的 ORDER BY 语句。

于 2012-09-13T10:45:00.500 回答