SQL选择语句更改隐式排序

时间:2014-10-22 15:23:50

标签: c# sql linq tsql sorting

今天我发现,至少我所看到的,是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语句的内容进行排序?

2 个答案:

答案 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子句。