【发布时间】:2021-04-30 17:41:04
【问题描述】:
我在今天重构的一些代码中遇到了以下内容。
context.Entities.Where(x => x.ForeignKeyId == id)
.OrderBy(x => x.FirstSortField)
.OrderBy(x => x.SecondSortField);
最初,我取出.OrderBy(x => x.FirstSortField) 认为第一个OrderBy 语句将被第二个OrderBy 替换。经过测试,我发现它生成的SQL是ORDER BY SecondSortField, FirstSortField。
因此,等价的其实是:
context.Entities.Where(x => x.ForeignKeyId == id)
.OrderBy(x => x.SecondSortField)
.ThenBy(x => x.FirstSortField);
谁能解释 EF6 这样做的原因?在我看来,将第一个排序字段替换为第二个会更直观。
【问题讨论】:
-
第一个
OrderBy被替换为第二个。您的“等价物”不是等价物。 -
@GertArnold,这就是我最初认为它会做的事情,直到我开始测试。例如,如果您在 LinqPad 中尝试此操作,它为这两个语句生成的 SQL 是等效的。
-
@JoelCoehoorn 这不是 LINQ-to-objects。该查询非常简单地转换为一个 ORDER BY 语句。看到它发生在我面前。
-
@WyattEarp 因为您似乎实际看到了生成的
ORDER BY,所以我想知道这里的定义因素是什么。你也在SQL Server吗?您基于此的实际查询是否在某些似乎并不重要的方面有所不同?真的,不是我不相信你,而是这种不同让我着迷。 -
[t0]是 LINQ-to-SQL 前缀。 EF 生成其他前缀。
标签: c# sql-server linq-to-sql