今天我发现,至少我所看到的,是SQL Server运营方式的一个主要缺陷。当使用显式ORDER BY子句执行查询时,我的印象是FIFO隐式排序。当然,在大多数情况下,这可以通过ID解析(因为通常ID按顺序给出)。然而今天我发现当我执行这段代码时,这不是真的
var BadQuery = Model.Titles.Where(t => t.ID > 19632)
.Select(i => new { i.ID, i.ExtTitleID })
.Take(10).ToList();
//BadQuery Results
//ID: 121148 ExtTitleID: 0001234
//ID: 132638 ExtTitleID: 000263
//ID: 132639 ExtTitleID: 000360
//ID: 132640 ExtTitleID: 000379
//ID: 132641 ExtTitleID: 000387
//ID: 132642 ExtTitleID: 000409
//ID: 132643 ExtTitleID: 000417
//ID: 134246 ExtTitleID: 000514
//ID: 132644 ExtTitleID: 000522
//ID: 132645 ExtTitleID: 000530
var GoodQuery = Model.Titles.Where(t => t.ID > 19632)
.Take(10).ToList()
.Select(i => new { i.ID, i.ExtTitleID }).ToList();
//GoodQuery Results
//ID: 19633 ExtTitleID: 30706
//ID: 19634 ExtTitleID: 30708
//ID: 19635 ExtTitleID: 30709
//ID: 19636 ExtTitleID: 3071
//ID: 19637 ExtTitleID: 30710
//ID: 19638 ExtTitleID: 30711
//ID: 19639 ExtTitleID: 30712
//ID: 19640 ExtTitleID: 30714
//ID: 19641 ExtTitleID: 30719
//ID: 19642 ExtTitleID: 3072
错误查询由ExtTitleID排序,它是数据库中的varchar。这不是我的预期。而良好查询按ID或FIFO顺序排序。
如果我之前在Query中添加了一个select语句,它似乎只按ExtTitleID排序。 Good Query ToList在它之前选择意味着选择在Linq to Object(c#)中发生而不是LinqToEntities(SQL)
我的问题是SQL如何确定订单的规范是什么? 此外,这种异常是否意味着我必须重构并明确地在查询中对任何具有select语句的内容进行排序?
答案 0 :(得分:4)
缺少ORDER BY
子句,SQL指定 nothing 关于结果行的顺序。在实践中,这种情况下的顺序取决于许多因素,包括数据结构(包括索引),查询和数据的详细信息,以及DBMS的实现。
如果您希望以特定顺序显示结果行,请使用适当的ORDER BY
子句。
答案 1 :(得分:3)
http://msdn.microsoft.com/en-gb/library/ms188385.aspx
“除非指定了ORDER BY子句,否则无法保证在结果集中返回行的顺序。”
因此没有默认的ORDER BY - 如果您希望结果的顺序是可预测的,那么您需要指定order by子句。