3

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

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();
4

1 回答 1

8

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

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

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

于 2013-03-15T02:59:42.260 回答