Queryable.OfType 如何工作?

2024-04-18

重要的问题不是“Queryable.OfType 是什么?do,它是“我在那里看到的代码如何实现这一点?”

反思 Queryable.OfType,我看到(经过一些清理后):

    public static IQueryable<TResult> OfType<TResult>(this IQueryable source)
    {
        return (IQueryable<TResult>)source.Provider.CreateQuery(
            Expression.Call(
                null, 
                ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(
                    new Type[] { typeof(TResult) }) ,
                    new Expression[] { source.Expression }));
    }

那么让我看看我是否明白了这一点:

  1. 使用反射来获取对当前方法 (OfType) 的引用。
  2. 通过使用 MakeGenericMethod 将当前方法的类型参数更改为,呃,完全相同的东西,创建一个完全相同的新方法。
  3. 该新方法的参数不是 source,而是 source.Expression。这不是 IQueryable,但我们将把整个事情传递给 Expression.Call,所以没关系。
  4. Call Expression.Call, passing null as method (weird?) instance and the cloned method as its arguments.
  5. 将该结果传递给 CreateQuery 并转换结果,这似乎是整个事情中最明智的部分。

现在,此方法的效果是返回一个表达式,该表达式告诉提供程序忽略返回类型不等于 TResult 或其子类型之一的任何值。但我看不出上面的步骤实际上是如何实现这一点的。它似乎正在创建一个表示返回 IQueryable 的方法的表达式,并使该方法的主体只是整个源表达式,而无需查看类型。是否只是期望 IQueryable 提供程序会默默地不返回任何不属于所选类型的记录?

那么,上述步骤在某种程度上是否不正确,或者我只是没有看到它们如何导致运行时观察到的行为?


它没有传入null作为方法 - 它将它作为“目标表达式”传递,即它调用该方法的内容。这是空的,因为OfType是静态方法,因此不需要目标。

打电话的要点MakeGenericMethod就是它GetCurrentMethod()返回开放版本,即OfType<>代替OfType<YourType>.

Queryable.OfType本身不是meant包含省略返回任何值的任何逻辑。这取决于 LINQ 提供商。要点是Queryable.OfType是构建表达式树以包含对OfType,这样当 LINQ 提供程序最终必须将其转换为其本机格式(例如 SQL)时,它就知道OfType被称为。

就是这样Queryable一般来说,它可以让提供者将整个查询表达式视为表达式树。这就是它的全部目的 - 当要求提供者将其转换为真实代码时,that's奇迹发生的地方。

Queryable它本身不可能完成这项工作 - 它不知道提供者代表什么类型的数据存储。它怎么能得出这样的语义OfType不知道数据存储是 SQL、LDAP 还是其他?我同意你需要一段时间才能清醒过来:)

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

Queryable.OfType 如何工作? 的相关文章

随机推荐

  • Windows 上的 unbuffer 程序相当于什么?

    你好根据这个帖子 https unix stackexchange com a 25375 unbuffer通过伪终端 pty 连接到命令 这使得系统将其视为交互式进程 因此不使用任何 stdout 缓冲 我想在 Windows 上使用这个
  • 寻找 Maven 工件:Spring + Hibernate + JPA

    我是 Maven 新手 有以下 2 个关于 Maven 的问题 我正在寻找一个包含 Spring Hibernate JPA 的 Maven 工件 我发现的唯一一种是与 Flex 混合的 现在 我想保持简单 并且不想处理 Flex 增加的复
  • 范围过滤器不适用于“gt”运算符,但适用于“lt”

    我正在使用弹性搜索来索引我的文档 并希望根据特定属性过滤文档 这是我的代码 filter push range audience ethnicity asian gt 50 它不适用于 gt 运算符 发回不一致的结果 但适用于 lt 运算符
  • ChromeDriver 的默认位置以及在 Windows 上安装 Chrome 的默认位置是什么

    我需要安装chromedriver在 Windows 操作系统上 他们在下面的文章中指定 https sites google com a chromium org chromedriver getting started https si
  • Xcode 8 控制台垃圾? [复制]

    这个问题在这里已经有答案了 还有其他人遇到过 Xcode 8 控制台显示一堆随机内容的问题吗 我不想让所有这些弄乱我的调试消息和日志 有人知道如何关闭此功能吗 编辑 发行说明指定控制台可能会转储对 watchOS 无用的内容 但不适用于 i
  • MySQL - 如何诊断警告“中止连接 - (读取通信数据包超时)”的原因

    我在运行 MySQL 的相当繁忙的 Windows 2008 R2 Web 服务器上遇到了一些问题 应用程序间歇性崩溃 日志通常指向 MySQL 作为路由原因 因为应用程序无法连接到 MySQL 这并不会影响所有用户 只会影响一些不幸的用户
  • Oracle - 如何使用快速刷新和联接创建物化视图

    所以我很确定 Oracle 支持这一点 所以我不知道我做错了什么 这段代码的工作原理 CREATE MATERIALIZED VIEW MV Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST
  • 将svn迁移到git的子目录

    我想用 git 替换我的 svn 存储库 不幸的是 我无法一次性完成此操作 长话短说 我需要将带有历史记录的 svn 存储库移动到预先存在的 git 存储库的子目录中 所以我目前有 svn svn1 svn2 git git1 git gi
  • vscode jest 扩展无法正常工作

    我正在与VSCode并安装了扩大 Jest 为了更好的笑话测试环境 在扩展的指令中我看到我们得到了很好的智能感知支持对于杰斯特的命令 问题 我在底部栏上没有看到 Jest 图标 这意味着文本无法正常工作 我仍然没有得到对 jest 命令的智
  • 为什么绑定参数不指向实际的函数参数

    为什么 limit 是 20 而不是 el 20 因为在 isFullAge bind this 20 中 20 是最后一个参数 所以它必须传递给 el 参数 但为什么它被设置为 limit 参数 var years 1990 1965 1
  • 如何在 iPhone 中不使用 NSDictionary/NSMutableDictionary 中的 Key 来获取值?

    我有一个 Json 键和值方法 格式的 Web 服务响应 我解析并获取了最多的 Web 服务方法 但是 在一种网络服务方法中 我无法从键中获取值 我在这里附上示例响应 lessons ObjectiveC Book brief desc O
  • asp.net core 5.0 RequestSizeLimit 不起作用

    我正在使用 ASP net core 5 0 看起来RequestSizeLimit不管用 我有以下控制器 HttpPost addfile RequestSizeLimit 5 242 880 5MB public IActionResu
  • RAY Python 框架内存不足

    我用 ray 创建了一个简单的远程函数 它占用的内存很少 然而 运行一小段时间后 内存稳步增加 并且出现 RayOutOfMemoryError 异常 下面的代码是这个问题的一个非常简单的例子 result transformed nump
  • Django Admin:将多个管理类注册到同一模型

    是否可以将多个管理类注册到同一模型 我想让 PostAdmin 和 MyPostAdmin 都注册到 Post 模型 现在我正在尝试将代理模型与 MyPost 一起使用 但它在管理面板中为我提供了两个不同的模型 并且具有各自的功能 管理员
  • Firebase 通过函数写入 Firestore 时出错:“7 PERMISSION_DENIED:缺少或权限不足”

    我正在尝试编写一个简单的 Firebase 函数 使用 TypeScript 将记录添加到 Firestore 代码的精简版本是 import as admin from firebase admin import as functions
  • php/mysql:自定义站点搜索

    首先 我无法使用 sphinx 因为我使用共享托管 我不喜欢谷歌解决方案 即 自定义搜索有这些愚蠢的广告 而且网站搜索不是免费的 我想自己创建搜索机制 我有页面表 我想通过关键字搜索页面内容 在结果页面上我想显示与所需关键字匹配的部分文本
  • 将 Laravel 项目文件保存在 public_html 中是否不安全?

    我在共享主机上的 public html 即下一级 中有 3 个不同的 laravel 项目 我更改了每个域 子域文档根路径以指向相应的项目 公共文件夹 即 public html project1 public 此外 我将 Options
  • 什么时候适合使用分号?

    我知道 JavaScript 以及 TypeScript 在很多情况下支持省略分号 尽管如此 我想添加分号以使其明确 如建议的那样TypeScript 深入探究 https basarat gitbooks io typescript co
  • LINQ to Entities 无法识别方法“System.String ToString(Int32)”

    您好 我正在使用 linq 查询 该查询抛出错误 LINQ to Entities does not recognize the method System String ToString Int32 method 并且此方法无法转换为存储
  • Queryable.OfType 如何工作?

    重要的问题不是 Queryable OfType 是什么 do 它是 我在那里看到的代码如何实现这一点 反思 Queryable OfType 我看到 经过一些清理后 public static IQueryable