替换表达式树中的类型

2024-02-09

我正在努力修改表达式树。我简化了示例,以便更容易在此处显示。让我们从两个类开始:

    public class Filter
    {
        public string FilterableProperty1 { get; set; }
        public string FilterableProperty2 { get; set; }
    }

    public class Entity
    {
        public string FilterableProperty1 { get; set; }
        public string FilterableProperty2 { get; set; }
        public string NonFilterableProperty { get; set; }
    }

Filter 类中的所有属性也存在于 Entity 类中。现在我想使用 Filter 类通过如下方法返回所需的实体:

    public IEnumerable<Entity> GetEntities(Expression<Func<Filter, bool>> filter)
    {
        Expression<Func<Entity, bool>> convertedFilter = Expression.Lambda<Func<Entity, bool>>(
            filter.Body,
            Expression.Parameter(typeof(Entity), filter.Parameters[0].Name));

        using (MyEntities entities = new MyEntities())
        {
            return entities.Entities.Where(convertedFilter);
        }
    }

所以基本上我只是改变表达式参数的类型。现在,当我像这样调用该函数时:

    public IEnumerable<Entity> GetFilteredEntities()
    {
        return GetEntities(x => x.FilterableProperty1 == "Test");
    }

我收到一个异常,说在指定的查询表达式中找不到参数 x。显然,通过替换 ParameterExpression 我破坏了一些东西。如何创建具有正确类型的新表达式来接管(或重建)原始表达式的主体?


经过更多搜索后,我在这里找到了答案:如何更改表达式树中的类型? https://stackoverflow.com/questions/14932779/how-to-change-a-type-in-an-expression-tree。当我提交问题时,它没有出现在建议中。

由于我实际上并不需要 Filter 类,因此我创建了一个仅包含我希望能够过滤的属性 (IEntity) 的接口,并修改了 Entity 类来实现它。现在我可以通过以下方式获得所需的结果:

// Example use: return entities.Entities.Where(ExpressionTransformer<IEntity,Entity>.Transform(filter));
internal static class ExpressionTransformer<TFrom, TTo> where TTo : TFrom
{
    public class Visitor : ExpressionVisitor
    {
        private ParameterExpression _parameter;

        public Visitor(ParameterExpression parameter)
        {
            _parameter = parameter;
        }

        protected override Expression VisitParameter(ParameterExpression node)
        {
            return _parameter;
        }
    }

    public static Expression<Func<TTo, bool>> Tranform(Expression<Func<TFrom, bool>> expression)
    {
        ParameterExpression parameter = Expression.Parameter(typeof(TTo));
        Expression body = new Visitor(parameter).Visit(expression.Body);
        return Expression.Lambda<Func<TTo, bool>>(body, parameter);
    }
}

如果您需要做类似的事情,但无法使用接口或无法使您的类实现该接口:答案也在上面提到的答案中

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

替换表达式树中的类型 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 如何在上传时裁剪图片?

    我正在做一个社交网络项目 我可以选择添加 编辑照片 当用户单击按钮时 图像将上传到数据库并进行更新 是否可以在图像发布之前裁剪图像保存到数据库 只需调用这个函数 用参数源 目的地和你想要的大小 function cropImage sour
  • 使用准备好的语句批量更新在Java中批量插入

    我正在尝试用大约 50 000 行 10 列填充 Java 中的结果集 然后使用将它们插入到另一个表中batchExecute的方法PreparedStatement 为了使该过程更快 我做了一些研究 发现在将数据读入 resultSet
  • 是否可以在 ODataController 中返回不同的模型?

    在 OData v4 控制器中 是否可以返回不同的模型Get 和Get FromIDataUri key 我喜欢使用 ViewModel 当使用Get 我想返回一个方法xxxOverviewViewModel 当使用Get FromIDat
  • Angular 2 中异步可观察对象和管道上的安全导航运算符

    在异步加载的可观察对象上使用安全导航运算符时 我遇到了将空值 而不是讲座数组 传递到管道的问题 div class list group item 讲座类型 pipe ts import Pipe PipeTransform from an
  • 如何让 JSON 不那么冗长?

    我目前正在开发一个 Web 应用程序并使用 JSON 进行 ajax 请求和响应 我有一个区域 以包含超过 10000 个对象的数组的形式向客户端返回非常大的数据集 这是示例的一部分 已稍微简化 schedules codePractice
  • 用于在 OWA Outlook 中打开对话的 URL 结构

    我正在尝试链接到 Outlook Web 应用程序中的特定对话 因此 我们的想法是 用户单击链接 OWA 将打开并显示特定的电子邮件对话 前提是用户有权访问 In this https social msdn microsoft com F
  • 在 Codeigniter 中搜索数据 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您能帮忙在 Codeigniter
  • Quartz CronExpression 获取所有表达式参数信息

    跟随我的上一个问题 https stackoverflow com questions 9699323 java quartz get all details from a scheduled job 9699495 comment1233
  • C# - 如何获取 oracle long 原始类型值

    如何使用 C 获取 long 原始类型值 由于你没有发布任何代码 我不知道你知道多少 我假设您已经了解如何使用 OracleDataReader 执行查询并返回结果集 LONG 和 LONG RAW 列有一个问题 您必须设置InitialL
  • 如何根据目标计算机(32 位或 64 位)有条件地使用 WiX 安装文件?

    我有一个包含 32 位版本和 64 位版本的文件 如果我在 32 位计算机上安装应用程序 我希望安装该文件的 32 位版本 同样 如果安装在 64 位计算机上运行 则应安装 64 位版本 如何检查使用 WiX 运行安装程序的机器类型 拜托
  • 为自定义组件创建样式的正确方法

    我在另一篇文章的末尾问过这个问题 但觉得这个话题需要一个自己的问题 如果我用自己的 style 创建了自己的组件 那么在不修改默认值的情况下将其与 Delphi 提供的定义样式合并的正确过程是什么 我可以将默认样式嵌入到我创建的组件中 并且
  • 反转 SVG 路径

    有没有简单的方法来反转 SVG 路径 我怎样才能让它从左上角开始 而不是从右下角开始
  • KeyCollection 作为 IEnumerable 会产生不一致的 LINQ 行为

    以下代码打印 false IEnumerable
  • 具有可移动和可旋转角色/物体/等的游戏中的 AABB

    我正在创建我的第一个 3D 游戏 但遇到了一些问题 我读到AABB https en wikipedia org wiki Minimum bounding box Axis aligned minimum bounding box相交以及
  • 正则表达式获取年份的最后两位数

    我必须使用正则表达式才能获取年份的最后两位数字 但前提是存在 4 位数字 我有以下正则表达式 当有 4 位数字时 它可以完美工作 示例 2014 14 2 然而 我需要这个只有在出现 4 位数字时才起作用 当只有 2 位数字存在时 我在清空
  • lupdate 和条件包含在 .pro 文件中

    我有一个包含条件包含的 pro 文件 如下所示 contains CONFIG embedded SOURCES a cpp HEADERS a h else SOURCES b cpp HEADERS b h 当我从终端运行 lupdat
  • 臭名昭著的 Apache 错误“父进程:子进程已退出,状态为 3221225477”

    我读过一些与臭名昭著的 Apache 错误相关的问题和回复 Apache error notice Parent child process exited with status 3221225477 Restarting 但到目前为止 没
  • EditorJS 总是呈现两个编辑器

    我正在尝试使用 EditorJS 的编辑器 一切工作正常 除了当我第一次加载页面时 它会在开始时初始化两个编辑器 并在每次重新加载页面时不断附加新编辑器 但它们都在里面 div div 分区我有什么遗漏的吗 react etc import
  • Webpack Uglify CSS 中的错误

    我强调要让 Uglify 与我的项目一起工作 以前我使用过 Uglify 并且没有出现问题 但现在我认为这与 SASS 相关 ERROR in css loader sass loader app scss global header sc
  • 替换表达式树中的类型

    我正在努力修改表达式树 我简化了示例 以便更容易在此处显示 让我们从两个类开始 public class Filter public string FilterableProperty1 get set public string Filt