使用 LINQ 时谓词的顺序重要吗?

2024-03-23

我知道以不同的顺序执行操作会产生不同的性能,例如以下慢速查询之间的差异:

List<TestItem> slowResults = items.OrderBy(item => item.StringItem)
                                  .Where(item => item.IntItem == 100)
                                  .ToList();

还有这个更快的:

List<TestItem> fastResults = items.Where(item => item.IntItem == 100)
                                  .OrderBy(item => item.StringItem)
                                  .ToList();

但这不是我的问题:


对于不同的 LINQ 提供商,答案会有所不同。特别是,LINQ to Objects 和 LINQ to Entities 的情况非常不同。

在 LINQ to Objects 中,Where 运算符接受 Func 形式的筛选器。 Func 是一个委托,因此出于本次讨论的目的,您可以将其视为函数指针。在 LINQ to Objects 中,您的查询相当于:

static void Main() {
    List<TestItem> results = items.Where(MyFilter).ToList(); 

static boolean MyFilter(TestItem item) {
    return item.Item1 == 12 && 
        item.Item2 != null && 
        item.Item2.SubItem == 65 && 
        item.Item3.Equals(anotherThingy)
}

主要需要注意的是 MyFilter 是一个普通的 C# 方法,因此适用普通的 C# 规则,包括 && 的短路行为。因此,条件将按照您编写的顺序进行评估。 LINQ to Objects 可以在不同的输入元素上调用 MyFilter,但它不能更改 MyFilter 的功能。

在 LINQ to Entities 和 LINQ to SQL 中,Where 运算符将筛选器接受为表达式>。现在,过滤器作为描述表达式的数据结构传递到Where 运算符。在这种情况下,LINQ 提供程序将查看数据结构(“表达式树”),并由 LINQ 提供程序决定如何解释它。

在 LINQ to Entities 和 LINQ to SQL 情况下,表达式树将转换为 SQL。然后由数据库服务器决定如何执行查询。绝对允许服务器对条件进行重新排序,并且它可能会进行更实质性的优化。例如,如果 SQL 表包含条件中引用的列之一的索引,则服务器可以选择使用该索引,甚至避免查看与该特定条件部分不匹配的行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LINQ 时谓词的顺序重要吗? 的相关文章

随机推荐

  • Mongodb 中将字段乘以值

    我一直在寻找一种方法来创建更新语句 该语句将采用现有的数字字段并使用表达式对其进行修改 例如 如果我有一个名为 Price 的字段 是否可以进行更新 将 Price 设置为现有值的 50 所以 给定 Price 19 99 我想做db co
  • indexOf 查找字符串中某个单词的所有出现位置

    我正在尝试使用 indexOf 查找句子中出现的所有字符 the 例如 如果句子是 那天我去了那里 则应返回 3 我能够做到这一点 直到找到第一个索引 但我不确定如何编写循环 我最初有一个 for 循环来搜索整个字符串 但它返回完整的字符串
  • 是否有工具可以可视化实时 Spring 应用程序上下文? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何工具可以获取完全构建 连线的 Spring 应用程序上下文并导出它的可视化 我说的是一个实时上
  • 如何将 C++ lambda 传递给需要函数指针和上下文的 C 回调?

    我正在尝试在使用标准函数指针 上下文范例的 C API 中注册回调 该 API 如下所示 void register callback void callback void void context 我真正想做的是能够注册一个 C lamb
  • SQL Server Filestream - 删除“速度”

    我第一次使用文件流数据类型 SQL Server 2008 当我进行一些快速插入 删除时遇到了问题 基本上 即使我手动调用垃圾收集器 文件实际从文件系统中删除的速度也比插入 删除速度慢得多 据我所知 CHECKPOINT 应该调用垃圾收集器
  • KAFKA 重启问题:在不删除 /tmp/kafka-logs 的情况下无法重启 kafka

    每当我尝试重新启动 kafka 时 都会出现以下错误 一旦我删除 tmp kafka logs 它就会得到解决 但它也会删除我的主题 有办法解决吗 ERROR Error while deleting the clean shutdown
  • Vim 自动生成 ctag

    现在我有以下内容 vimrc au BufWritePost c cpp h ctags R 这有几个问题 它很慢 为自上次标记生成以来未更改的文件重新生成标记 我必须按下输入按钮again写入文件后 因为不可避免的 按 Enter 或键入
  • Java 8 流:java.lang.IllegalStateException:结束大小 84758 小于固定大小 84764

    我在用Java 8 streams用于将映射值转换为数组的 API 我收到以下异常 Unhandled exception ScheduledExecutorService java lang IllegalStateException E
  • 检查 NSDate 是本周还是下周

    有没有办法检查 NSDate 是本周还是下周 我知道今天是 NSDate date 然后我该怎么办 使用 NSDateComponents 如下所示 NSCalendar gregorian NSCalendar alloc initWit
  • 将 .Net Core Web-API 迁移到 AWS Web Api 网关

    我有一个使用 Net Core 开发的 Web API 它有几个端点 GET POST 要求是将其移至 AWS API Gateway 该 Web API 是使用分层架构构建的 它有一个与 Db 层通信的业务层 该层拥有一些实体框架存储库
  • 如何使用 jax-rs 进行分段/表单文件上传?

    特别是 RESTeasy 如果 对于单个文件 有一个像这样的方法签名那就太好了 public void upload FormParam name FormParam file file InputStream 可行吗 还是我在做梦 似乎没
  • 将数据帧转换为向量(按行)

    我有一个包含像这样的数字条目的数据框 test lt data frame x c 26 21 20 y c 34 29 28 我怎样才能得到下面的向量 gt 26 34 21 29 20 28 我能够使用以下方法获得它 但我想应该有一种更
  • 微服务中的服务器到服务器通信

    我正在研究微服务架构 但我在这方面面临一些挑战 首先让我向您简要介绍一下架构 用户登录并获取签名令牌 该令牌将用于调用所有 REST API 将会有很多 API 服务器 其中 API 使用 Spring 安全性进行保护 并根据用户角色进行授
  • 奇数或偶数反斜杠和转义字符

    我对下面的代码有一点问题 import re pattern re compile r for text in r ok py r ok py r ok py r ok py r ok py search re search pattern
  • ReactJs“不变违规...”经典反应问题

    这是一个典型的反应问题 但我有点不知道如何处理它 我只想动态渲染我的表格线 但我收到错误 未捕获错误 不变违规 processUpdates 无法找到元素的子元素 2 这可能意味着 DOM 意外变异 例如 通过浏览器 通常是由于在使用表 嵌
  • 如何以简单的方式将 CGPoint 对象添加到 NSArray 中?

    我有大约 50 个 CGPoint 对象 它们描述了类似 路径 的东西 我想将它们添加到 NSArray 中 这将是一个只返回给定索引对应的 CGPoint 的方法 我不想创建 50 个变量 例如 p1 p2 依此类推 有没有一种简单的方法
  • 在 Windows Phone 8 中存储配置值/设置的最佳方法

    由于 WP8 应用程序中没有默认配置文件 因此存储配置值的最佳方式是什么 例如WCF 服务 URL 用户名和密码 我希望当手机重新启动且应用程序关闭时这些值可用且可更新 提前致谢 你应该使用IsolatedStorageSettings A
  • 如何在 Swift 中的自定义类中初始化 Timer? [复制]

    这个问题在这里已经有答案了 我制作了一个简单的计时器应用程序 但是 现在我想让它变得更好 并且我想为计时器控件编写一个类 class Cronometer private var counter Int 0 private var time
  • https://graph.microsoft.com/v1.0/places/microsoft.graph.room Api 未提供更新的数据

    我正在使用 Microsoft Graph 获取可供租户使用的房间列表 根据文档 列出 Palace Api 应该用于此目的 现在 我在使用 List Places api 获取更新数据时遇到问题 我已向租户添加了一些房间 但这些房间并未反
  • 使用 LINQ 时谓词的顺序重要吗?

    我知道以不同的顺序执行操作会产生不同的性能 例如以下慢速查询之间的差异 List