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

时间:2013-03-15 02:57:02

标签: c# linq ado.net

我想知道......在我的申请中,我正在做这样的事情:

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

如果我在Where()之前做了OrderBy()会怎么样?是否重要,而对于skip()或take(),这些问题的位置是否也很重要?

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

1 个答案:

答案 0 :(得分:8)

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

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

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