c# - 在 Where() 之前调用 OrderBy() 的区别,反之亦然

标签 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();

最佳答案

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

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

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

关于c# - 在 Where() 之前调用 OrderBy() 的区别,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15423915/

相关文章:

c# - 反序列化使用不同版本的已签名程序集编写的泛型的最佳方法是什么?

c# - XmlReader 不考虑文档类型符号

c# - "Selecting"或 "Wrapping"一个 IQueryable 以便它仍然可查询

c# - 在 LINQ 中使用 Union 合并列表时删除重复项

c# - ConcurrentDictionary - 损坏的字典或错误的代码?

c# - 如何在 LINQ 查询中分组和排序

c# - SQL参数编辑

sql-server - SQL Server 性能 - 架构与多个数据库

asp.net-mvc - 如何从多个模型中设置一个 Viewmodel?

c# - 命名空间中的函数?