【发布时间】:2014-12-18 02:52:10
【问题描述】:
今天我刚刚发现,至少我所看到的,是 SQL Server 操作方式中的一个重大缺陷。我的印象是,在没有显式 ORDER BY 子句的情况下执行查询时,SQL 会按 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 排序,ExtTitleID 是数据库中的一个 varchar。这不是我所期望的。而 Good Query 按 ID 或 FIFO 顺序排列。
如果我之前在查询中添加选择语句,似乎只能按 ExtTitleID 排序。选择之前的 Good Query ToList 意味着选择发生在 Linq to Object (c#) 而不是 LinqToEntities(SQL)
我的问题是 SQL 如何确定顺序的规范是什么? 另外,这种异常是否意味着我必须重构并明确订购查询中包含 select 语句的任何内容?
【问题讨论】:
-
如果您希望结果集以某种方式排序,请使用
ORDER BY。见this question。 -
根据 SQL 规范,行中没有顺序。你错了。
-
哎呀,我想这就是我不应该依赖归纳推理的原因。好吧,现在我必须重构我曾经做过的每一个 Linq 调用......经验教训。