【发布时间】:2014-11-13 08:46:23
【问题描述】:
我正在尝试一个简单的 OrderBy 语句。
要订购的目标数据如下:
[
{"id":40, "description":"aaa", "rate":1},
{"id":1, "description":"bbb", "rate":1},
{"id":4, "description":"ccc", "rate":2},
{"id":19, "description":"aaa", "rate":1}
]
然后我按 rate 属性订购商品。
奇怪的是,如果我“订购”它们,它会通过给定的偏移量“跳过”一些项目,然后只“获取”部分数据。
例如,
var result = items.OrderBy(i => i.rate);
var result = result.Skip(2);
var result = result.Take(2);
结果大部分看起来都很好,但根本没有返回“边缘情况”项。
例如,
如果第一个结果返回为
[{"id":40, "description":"aaa", "rate":1}, {"id":1, "description":"bbb", "rate":1}]
第二个结果像
[{"id":1, "description":"bbb", "rate":1}, {"id":4, "description":"ccc", "rate":2}]
第二个查询调用没有返回项目“id: 19”。而是项目“id: 1”返回了两次。
我的猜测是,SQL OrderBy 语句不会在每次 OrderBy 对给定属性进行排序时生成相同的排序列表,但是共享相同属性的组内的确切顺序可能会发生变化。
引擎盖下的确切机制是什么?
【问题讨论】:
-
如果您不指定顺序,则无法保证。如果您指定多个列,例如
order by rate, description,然后它将按rate排序,然后rate值重复,description。rate和description可能仍然有多个具有相同值的行,并且它们的顺序将保持未指定。id经常被用作平局以确保稳定的订单:order by rate, description, id。 -
顺序可能不同的一个实际原因:一些快速排序算法会随机选择枢轴。
标签: sql .net sql-server linq linq-to-objects