动态构建表达式树

2024-03-05

我正在遵循这个很好的例子:将 Linq to Sql 表达式转换为表达式树 https://stackoverflow.com/questions/5225416/convert-linq-to-sql-expression-to-expression-tree

就我而言,我正在尝试构建一个表达式树,其中要过滤的类型仅在运行时已知,并表示为字符串。在上面的例子中,类型Region已经知道并直接输入:

ParameterExpression pe = Expression.Parameter(typeof(Region), "region");

在我的应用程序中,我可以将其重写为:

ParameterExpression pe = Expression.Parameter(Type.GetType("mystring"), "listData");

我的绊脚石是这个例子:

MethodCallExpression whereCallExpression = Expression.Call(
            typeof(Queryable),
            "Where",
            new Type[] { query.ElementType },
            query.Expression,
            Expression.Lambda<Func<Region, bool>>(e3, new ParameterExpression[] { pe }));
var results = query.Provider.CreateQuery<Region>(whereCallExpression);

在这两行中Region是直接打字的。有没有一种方法可以动态使用字符串“Region”来实现相同的目的?


当然可以,但是您必须了解其中的含义。类型名称Region是编译时类型。使用它,您可以生成强类型查询。但是,由于您在编译时没有类型,因此您can仍然生成查询,但不会是强类型的。

您可以使用非泛型重载生成未知编译时类型的 lambda 表达式。同样与CreateQuery() method.

这是同一查询的两个版本,用于检查某些属性值是否与给定值匹配。一种是通用的,另一种则不是。

通用版本隐式地从查询的类型中获取类型。

public IQueryable<TSource> PropertyEqualsValue<TSource>(IQueryable<TSource> query,
        string propertyName, object value)
{
    var param = Expression.Parameter(typeof(TSource));
    var body = Expression.Equal(
        Expression.Property(param, propertyName),
        Expression.Constant(value)
    );
    var expr = Expression.Call(
        typeof(Queryable),
        "Where",
        new[] { typeof(TSource) },
        query.Expression,
        Expression.Lambda<Func<TSource, bool>>(body, param)
    );
    return query.Provider.CreateQuery<TSource>(expr);
}
var query = PropertyEqualsValue(SomeTable, "SomeColumn", "SomeValue");

而另一个类型取自提供的typeName。请注意,创建查询时,我们无法提供类型,因为我们在编译时不知道类型是什么。

public IQueryable PropertyEqualsValue(IQueryable query,
        Type type, string propertyName, object value)
{
    var param = Expression.Parameter(type);
    var body = Expression.Equal(
        Expression.Property(param, propertyName),
        Expression.Constant(value)
    );
    var expr = Expression.Call(
        typeof(Queryable),
        "Where",
        new[] { type },
        query.Expression,
        Expression.Lambda(body, param)
    );
    return query.Provider.CreateQuery(expr);
}
var type = Type.GetType("Some.Type.Name");
var query = PropertyEqualsValue(SomeTable, type, "SomeColumn", "SomeValue");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态构建表达式树 的相关文章

  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int

随机推荐

  • 在 Maps API 浏览器上设置 HTTP Referrer 会导致 403 错误

    我对 HTTP Referrer 设置如何在 Google Maps API 浏览器密钥上工作感到困惑 我正在构建一个网页 以编程方式从 Google 地图请求图像 主要是 Google 地图街景图像 API 但也从 Javascript
  • spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?

    当我开始学习spring webflux 我对这个组件有疑问 我建立了一个简单的项目 使用maven来管理它 我添加了相关的依赖项spring boot starter web and spring boot starter webflux
  • Rufus 调度程序未登录生产环境

    我的 Rails 应用程序在初始化程序中使用 rufus scheduler 启动一个进程 这是初始化程序代码的精简版本 config logger isn t available here so we have to grab it fr
  • React 将 JQuery 代码应用于组件内的元素

    我有一个正在使用 React 的应用程序 我现在遇到一个问题 我正在尝试实施bootstrap 所见即所得 bootstrap3 所见即所得 https github com bootstrap wysiwyg bootstrap3 wys
  • 自动删除SQS队列

    有没有办法完全自动删除 SQS 队列 我有一个解决方案 其中服务器在启动时创建 SQS 并订阅 SNS 主题 然而 可能存在服务器崩溃且无法恢复的情况 在这种情况下 我会用另一台服务器替换该服务器 该服务器会在启动时创建自己的队列 现在之前
  • 对多个区域使用 Matcher.appendReplacement()

    java Matcher appendReplacement 方法 带有appendTail 应该让我将源文本转换为结果文本 同时替换所有出现的模式 伪语言的算法类似于 while Matcher find call Matcher app
  • 用于检查大网址列表中损坏链接的 Python 工具

    我有一个正在生产的搜索引擎 为大约 700 000 个网址提供服务 爬行是使用 Scrapy 完成的 所有蜘蛛程序都使用 DeltaFetch 进行调度 以便获取每日新链接 我面临的困难是处理损坏的链接 我很难找到一种定期扫描和删除损坏链接
  • 是否可以将 HTML/CSS 布局与 GWT 逻辑完全分离?

    我想让我们的 Web 开发人员继续使用纯 HTML 工作 并让开发人员编写 GWT 仅 Java 代码来编写其余的业务逻辑 有可能吗 有人尝试过在 GWT 环境中与 Web 开发人员一起工作吗 如何将 Web 开发人员纳入 GWT 开发流程
  • Typescript 实现接受多种类型输入的通用函数

    出于抽象目的 我需要实现一个接受不同类型输入的函数 type ContentA string type ContentB number type InputA name method a content ContentA type Inpu
  • 如何在 Visual Studio 中切换自动换行?

    Visual Studio NET 是否有办法打开和关闭自动换行 我习惯了 Eclipse 中的这个功能 它允许您右键单击并打开和关闭自动换行 这样当您有向右延伸的长行时 您不必向右和向左移动底部滚动条阅读你的代码 html http we
  • 从字符串在 node.js 中创建一个文本文件并将其作为响应进行流式传输

    我正在使用express js 我有一个字符串 Hello world 我希望用户点击 a href download Download a 用户应该下载包含文本的 Hello txt 而不是打开包含文本的选项卡 我已经四处寻找实现此目的的
  • 如何在 Xcode 4.5 上安装 iOS 4.3 模拟器?

    我通过 App Store 安装了 Xcode 4 5 它支持 iOS 5 1 和 6 0 但不支持 iOS 4 3 也无法在首选项的 下载 选项卡中下载 我尝试从另一台计算机上抓取它并将其放在这台计算机上 因为多米尼克 波拉达描述 htt
  • 如何根据字符数确定文件大小?

    在 Windows 上使用 java 和 jcifs 读取文件 我需要确定文件的大小 其中包含多字节以及 ASCII 字符 我怎样才能有效地实现它或java中的任何现有API Thanks 毫无疑问 要获得确切的字符数 您必须使用正确的编码
  • C# 或 VB 文档注释中的粗体还是斜体?

    有没有办法使用bold or italic里面的文档注释 就像是
  • secItemCopyMatching 返回 nil 数据

    首先 我观看了 WWDC 2013 关于使用钥匙串保护秘密的会议 我想做一个基本的密码存储 看完了整个视频 但在视频的前 10 分钟找到了我需要的东西 这看起来很简单 但我不完全理解数据编码和检索是如何工作的 问题 在 secItemCop
  • 有没有办法跟踪 API 网关限制的调用?

    我一直在使用 CloudWatch 跟踪 API Gateway 和 Lambda 的指标 它显示 Lambda 的受限制的调用 但是有什么方法可以查看 API Gateway 之前限制的调用数量 还没有 但我们计划在不久的将来解决这个问题
  • 自动委托java类的所有方法

    假设我有一个包含许多公共方法的类 public class MyClass public void method1 public void method2 public void methodN 现在我想创建一个wrapper类 它将所有方
  • 使用 javascript 旋转 div

    我想单击一个 div 并旋转另一个 div 然后当再次单击第一个 div 时 另一个 div 旋转回其原始位置 如果需要我可以参考这个库http ricostacruz com jquery transit http ricostacruz
  • 创建新的 SQLCommand 或重复使用相同的 SQLCommand

    我需要使用 ADO NET 将一系列命令发送到 SQL 2008 以便逐个执行 我应该为我发送的每个 SQL 创建一个新的 SQLCommand 吗 或者重用相同的 SQLCommand 并仅更改 CommandText 属性 谢谢 内斯特
  • 动态构建表达式树

    我正在遵循这个很好的例子 将 Linq to Sql 表达式转换为表达式树 https stackoverflow com questions 5225416 convert linq to sql expression to expres