在Where()之前调用OrderBy()的差异,反之亦然

oje*_*jek 3 c# linq ado.net

我想知道......在我的应用程序中,我正在做这样的事情:

var threads = scykDb.Threads
                    .AsQueryable()
                    .Where(condition)
                    .OrderByDescending(t => t.DateCreated)
                    .Skip(threadsToSkip)
                    .Take(threadsPerPage)
                    .Select(t => t)
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

如果我在Where()之前做了OrderBy()会发生什么?是否重要以及skip()或take(),那些重要的位置呢?

var threads = scykDb.Threads
                    .AsQueryable()
                    .OrderByDescending(t => t.DateCreated)
                    .Where(condition)
                    .Skip(threadsToSkip)
                    .Take(threadsPerPage)
                    .Select(t => t)
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 8

如果您的查询实际上是通过Entity Framework,Linq-to-SQL或其他此类提供程序对数据库进行的,则示例中的调用顺序无关紧要.

如果这是针对内存中的集合发生的,则在过滤之前进行排序,这比首先应用过滤器更不理想.例如,您正在订购可能丢弃的元素.(订购涉及相当多的工作.首先过滤会减少这项工作.)

也就是说,即使反对数据库,我也会争论第二种形式,因为相同的代码对于内存中查询同样有效,因此养成以通常理想的方式编写代码的习惯.也有争议的是,您可能希望在订购之前看到过滤,这是一个思考过程.

  • 我注意到,当然可以编写Linq-to-objects的实现,该实现检测orderby之后何时发生,并像数据库一样优化工作流.实现实际上并没有这样做,但它是可能的.Linq-to-objects*的实现*会对where和select子句进行一些小的重组,以使它们在常见情况下更有效. (4认同)