C#Expression表达式树(lambda)的使用——Parameter、Property、Call、构建Select、构建Where

2023-11-03

1、定义参数(Parameter)、访问属性(Property)

private static void Main(string[] args)
{
    //1.定义参数(Parameter)、访问属性(Property)
    //定义表达式树中的参数或变量(linq表达式参数的名称,如m=>m.Name中的m)
    var param = Expression.Parameter(typeof(List<string>), "m");
    //创建对象中可访问的成员属性
    var member = Expression.Property(param, "Count");
    //创建编译时已知委托类型的lambda表达式(Func<List<string>, int>:参数类型为List<string>,返回类型为int)
    var lambda = Expression.Lambda<Func<List<string>, int>>(member, param);
    //委托执行lambda表达式
    int result = lambda.Compile()(new List<string> { "a1", "b1", "c1", "d1" });
    Console.WriteLine(result);
    Console.ReadKey();
}

2、调用方法(Call)

public class UserInfo
{
    public string Id { get; set; }
    public string Name { get; set; }
    public bool SP_IsDelete { get; set; }
    public UserInfo()
    {
    }
}

private static void Main(string[] args)
{
    //2.调用方法或函数(Call)
    //(1).调用静态方法
    //var method = Expression.Call(
    //    null, //static方法实例为null
    //    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), //调用的方法名和参数类型
    //    Expression.Constant("调用WriteLine方法")); //传入参数值
    //var lambda = Expression.Lambda<Action>(method); //创建lambda表达式
    //lambda.Compile(); //执行lambda表达式
    //(2).调用实例方法
    var param = Expression.Parameter(typeof(UserInfo), "m"); //定义变量           
    var method = Expression.Call(
        param, //实例
        typeof(UserInfo).GetMethod("Print", new Type[] { typeof(string) }), //调用的方法名和参数类型
        Expression.Constant("打印出来!!!")); //传入参数值           
    var lambda = Expression.Lambda<Action<UserInfo>>(method, param); //创建lambda表达式
    lambda.Compile()(new UserInfo()); //执行lambda表达式
    Console.ReadKey();
}

3、实例化引用类型

private static void Main(string[] args)
{
    //3.实例化引用类型
    //调用构造函数
    var cons = Expression.New(typeof(UserInfo));
    //给UserInfo对象的属性Name赋值
    var binding = Expression.Bind(typeof(UserInfo).GetMember("Name")[0], Expression.Constant("张三"));
    //实例化UserInfo对象
    var newEnt = Expression.MemberInit(cons, new List<MemberBinding>() { binding });
    Console.ReadKey();
}

4、定义集合变量、初始化、添加元素

private static void Main(string[] args)
{
    //4.定义集合变量、初始化、添加元素
    var listAdd = typeof(List<string>).GetMethod("Add");
    var add1 = Expression.ElementInit(listAdd, Expression.Constant("a"));
    var add2 = Expression.ElementInit(listAdd, Expression.Constant("b"));
    var add3 = Expression.ElementInit(listAdd, Expression.Constant("666"));
    var list = Expression.New(typeof(List<string>));
    //初始化值
    var setList = Expression.ListInit(list, add1, add2, add3);
    //输出信息
    Console.WriteLine(setList.ToString());
    //访问属性
    var member = Expression.Property(setList, "Count");
    var lambda = Expression.Lambda<Func<int>>(member);
    int result = lambda.Compile()();
    Console.WriteLine(result);
    Console.ReadKey();
}

5、实战:过滤多字段(lambda表达式构建Select)

public static IQueryable<T> FilterFields<T>(this IQueryable<T> query, List<string> fields, string paramName = "m")
{
    //定义表达式树中的变量(linq表达式参数的名称,如m=>m.Name中的m)
    var param = Expression.Parameter(typeof(T), paramName);
    /* typeof(T).GetProperty(m):获取成员属性信息
     * Expression.Property(param, m):对象T中的成员属性
     * Expression.Bind:给字段或属性初始化并赋值
     */
    var bindings = fields.Select(m => Expression.Bind(typeof(T).GetProperty(m), Expression.Property(param, m)));
    /* Expression.New(typeof(T)):调用无参构造函数
     * Expression.MemberInit:实例化对象并为属性设置值
     */
    var newEnt = Expression.MemberInit(Expression.New(typeof(T)), bindings);
    //创建lambda表达式(Func<T,T>:参数类型为T,返回类型为T)
    var lambda = Expression.Lambda<Func<T, T>>(newEnt, param);
    return query.Select(lambda);
}

6、实战:字段条件筛选(lambda表达式构建Where)​​​​​​​

public static IQueryable<T> NoDelete<T>(this IQueryable<T> query, string fieldName = "IsDelete", string paramName = "m")
{
    //创建表达式中的参数或变量(如m=>m.IsDelete==false中的m)
    var param = Expression.Parameter(typeof(T), paramName);
    //创建表达式中左边的属性(如m=>m.IsDelete==false中的m.IsDelete)
    var left = Expression.Property(param, fieldName);
    //创建表达式中右边的常量表达式(如m=>m.IsDelete==false中的false)
    var right = Expression.Constant(false);
    //创建成二元运算符表达式(如m=>m.IsDelete==false中的==)
    var body = Expression.Equal(left, right);
    //拼接成筛选条件
    return query.Where(Expression.Lambda<Func<T, bool>>(body, param));
}

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

C#Expression表达式树(lambda)的使用——Parameter、Property、Call、构建Select、构建Where 的相关文章

  • nuget nuspec清单描述

    创建NuGet包 在创建一个NuGet包之前我们应该先创建一个以 nuspec为后缀的xml清单文件 这个清单文件描述了包的内容 在安装NuGet包的过程中这个清单文件扮演者很重要的角色 实际上它的作用就像app config一样 并且是不
  • (C语言)多项式加法

    多项式加法 问题描述 编写一个程序 实现两个多项式的加法运算 要求用一个有序的链表表示一个多项式 每一项用一个结点表示 在链表中按照项的幂数进行排列 输入形式 两个多项式 用空格隔开 每个多项式中没有空格 每项的系数是浮点数 每项的指数是非
  • 联想小新进入BIOS方法(解决安装VM虚拟机提示“Intel VT-x处于禁用状态”)

    最近要学项目部署 所以先安装个VWmare虚拟机 在虚拟机里安装Linux系统 我下载好Linux的镜像文件后 在vw里创建新的虚拟机时报错 发现我的电脑的虚拟化是禁用的 于是我在网上查了一下得打开BIOS才能修改虚拟化设置 问题是 我的电
  • 线性代数复习公式整理(自用/持续更新)

    文章目录 第一章 行列式 秩 化 叉 型行列式 化 ab 型行列式 化 三条杠 型行列式 化 两线加一点 型行列式 行列式运算 第二章 矩阵 矩阵与初等矩阵相乘做初等变换 矩阵转置的性质 矩阵伴随的性质 矩阵的逆的性质 矩阵可逆的充要条件
  • NeurIPS 2021 | Twins:重新思考高效的视觉注意力模型设计

    Twins 是美团和阿德莱德大学合作提出的视觉注意力模型 相关论文已被 NeurIPS 2021 会议接收 本文主要讲述 Twins 解决的难点 设计和实现思路 以及在美团场景的探索落地 希望能对从事视觉算法研发的同学有所帮助和启发 导读
  • SecureCRT日志上添加时间戳

    1 首先成功使用secureCRT打印串口信息 2 打开option菜单的session options对话框 3 点击LogFile选项 输入log文件路径和名字 最后在log data输入 Y M D h m s t 最后点击OK 4
  • MySQL下载步骤详解

    对于不同的操作系统 MySQL 提供了相应的版本 在 Windows 操作系统下 MySQL 数据库的安装包分为图形化界面安装和免安装这两种安装包 这两种安装包的安装方式不同 配置方式也不同 图形化界面安装包有完整的安装向导 安装和配置很方
  • my学习OC--流程控制

    1 顺序结构 编程语言中最常见的就是顺序结构 顺序结构就是程序从上到下一行一行执行 中间没有判断和跳转 如果main韩式几行代码间没有任何流程控制 则程序总是由上到下依次执行 2 条件语句 if 和 switch语句 if语句和switch
  • Parameter ‘contractState‘ not found. Available parameters are [request, page, param1, param2]

    目录 一 问题描述 二 解决过程 一 问题描述 org mybatis spring MyBatisSystemException nested exception is org apache ibatis binding BindingE
  • 博云,站在中国容器潮头

    容器云 微服务 中间件 AI 容器安全 每一个关键词背后 对应的是博云的新故事 是中国容器市场的新故事 也更是新一代定位PaaS的中国企业的故事 作者 皮爷 出品 产业家 2019年年底 赵安全邀请了三家服务过的企业客户来到公司总部 他是博
  • Android开发“仿美团”

    步骤分析 1 需求分析 首先需要确定该app的功能 包括用户端和商家端 以及必要的后台管理系统 需要考虑到美团app的主要功能 如定位 搜索 点评 下单 支付等 2 UI设计 根据需求确定app的界面设计风格 布局 色彩等 要考虑到用户体验
  • mybatis-plus在实体中加入其他不属于数据库表的字段注释和数据类型的转换

    一 mybatis plus在实体中加入其他不属于数据库表的字段注释和数据类型的转换 数据库 MySQL 表 t society problems 字段 PROBLEM TYPE 题干类型 类型 int 业务描述 在导入Excel文档时候
  • virtualbox无法安装64位系统

    今天在实验室用VirtualBox安装 64位的Ubuntu系统 在安装时没有显示64位的Linux安装项 只有32位的Linux安装选项 为了以后遇到能够快速解决 我就把坑在这里填了吧 要安装64位的虚拟机要满足下面几个条件 1 CPU要
  • 【面试宝典】面试中你能遇到的问题答案全在这儿了

    人生中最尴尬的考试不是你不会 而是明明知道答案也答不对 职上网小编 人生数十载 考试千百回 小时候我们有小考 中学时我们有中考 高中时我们有高考 大学时我们还有大考 而在要工作时我们还要面考 总少不了以下这几个问题 请做一下自我介绍 请说一
  • unity-3d:打飞碟游戏

    unity 3d 打飞碟游戏 1 编写一个简单的鼠标打飞碟 Hit UFO 游戏 uml类图 Director DiskData DiskFactory FirstController FlyActionManager Interface
  • VMware虚拟机中如何配置静态IP,以及DNS服务器

    参考的是这位同学的博客 写这篇博客是为了自己学习用 到时候忘记了可以翻出来看看 这个是VMware的草图 1 查看网关 以及网段 将VMnet8中 使用本地DHCP服务将IP地址分配给虚拟机 的选项去掉 然后点击NAT设置 记住这上面的NA
  • Nginx具体配置(三)

    一 Nginx配置实例 反向代理 实例一 1 1 实现效果 在Windows浏览器地址栏中输入www 123 com 跳转到Linux系统中的tomcat主页面 访问Nginx 192 168 92 130 80 访问Tomcat 192
  • 在colab上部署novelAI

    目录 一 获取模型 1 使用他人提供的模型链接直接在Google云端硬盘中添加快捷连接 推荐 2 自己上传模型到Google云端硬盘 二 colab上进行操作 第一步 加载Google云盘 第二步 克隆git仓库 第三步 安装依赖 第四步
  • Spring Boot 学习研究笔记(十七) -Spring boot JPA的复杂查询

    Spring boot JPA的复杂查询 一 JpaSpecificationExecutor 接口查询方式 1 JpaSpecificationExecutor接口 JPA 提供动态接口JpaSpecificationExecutor 利
  • JavaScript 算法 -- 贪心算法

    文章目录 贪心算法 例题一 分饼干 例题二 买卖股票的最佳时机 II 贪心算法 贪心算法是算法设计的一种方法 期盼通过每个阶段的局部最优选择 从而达到全局的最优 但最后的结果不一定最优 例题一 分饼干 param number g 胃口 p

随机推荐

  • 【机器学习算法】感知机模型

    文章目录 1 感知机模型 2 收敛性证明 Novikoff定理 3 感知机对偶形式 4 感知机的缺点 5 感知机的几个变形 5 1 投票感知机 5 2 平均感知机 1 感知机模型 感知机模型是一个二分类的模型 它通过形如 y w x
  • 前后端交互之解决跨域问题!!!!

    报错 XMLHttpRequest cannot load http 127 0 0 1 8080 detail all No Access Control Allow Origin header is present on the req
  • 小娜老师的讲义-Docker的管理工具们(Kubernetes)

    Kubernetes k8s 是自动化容器操作的开源平台 这些操作包括部署 调度和节点集群间扩展 如果你曾经用过Docker容器技术部署容器 那么可以将Docker看成Kubernetes内部使用的低级别组件 Kubernetes不仅仅支持
  • Python学习--函数与Lambda表达式

    链接 DataWhale函数与Lambda表达式 目录 1 函数 函数的定义 函数的调用 函数的返回值 函数文档及注解 函数参数 1 位置参数 2 默认参数 3 可变参数 4 关键字参数 5 命名关键字参数 6 参数组合 变量作用域 内嵌函
  • 一个能干掉90%候选人的Kafka面试连环炮!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 写在前面 2 如何保证宕机时数据不丢失 3 多副本冗余的高可用机制 4 多副本之间数据如何同步 5 ISR到底指的什么东西 6 acks参数的含义 7 最后
  • Less 18 (请求头注入--user-agent注入)

    文章目录 1 题目分析 2 构造SQL 3 手工注入 4 使用python进行注入 5 SQLmap注入 1 题目分析 首先我们来分析一下题目 经过尝试 我们知道 当我们输入正确的用户名和密码的时候 后台会将User Agent返回到屏幕上
  • 全国计算机等级考试题库二级C操作题100套(第89套)

    第89套 给定程序中 函数fun的功能是 求出形参ss所指字符串数组中最长字符串的 长度 其余字符串左边用字符 补齐 使其与最长的字符串等长 字符串数组中共 有M个字符串 且串长
  • 正点STM32F407核心板+ESP8266实现简单通信(详细讲解)

    1 ESP8266固件库的烧录 如果用串口助手连上板子 给8266发送AT指令发现老是报错error 可以重新烧录一下固件库 正点的ESP8266资料下载网址 http www openedv com thread 308397 1 1 h
  • tcp连接多久会自动断开_K8s 节点断开连接后,本在运行的 Pod 会如何?

    在工作节点与主节点断开连接后 工作节点上的 Pod 是什么状态 是否在继续运行 Kubernetes 控制器又在做什么 本文对此进行了实例研究 一一解答 作者 Bhargav Bhikkaji 翻译 Bach 才云 校对 星空下的文仔 才云
  • 微信小程序云开发之初体验(详细教程)

    微信小程序云开发之初体验 小程序云开发是微信最近推出的新的一项能力 它弱化了后端以及运维的概念 开发者无需搭建服务器 使用微信平台提供的api即可完成核心的业务开发 目前提供三大基础能力支持 云函数 在云端运行的代码 微信私有协议天然鉴权
  • 刷脸支付普及逐渐攀升产业生态逐渐形成

    刷脸让支付生态重返硬件年代 刷脸支付机具的生产 销售 铺设 维护涉及大量成本 客观存在压货风险大 后期服务难 地推成本高等问题 模式重而受益低 导致银行和大多数中小支付机构入局刷脸支付的意愿则整体薄弱得多 银联高调入局之际 2019 也是支
  • 《啊哈算法》学习——桶排序

    学习啊哈算法第一天 第一章第一节最快最简单的桶排序 问题描述 班级五名同学的分数排序 十分制 问题分析及思路 借助大小为10的一维数组 初始化为0 意味该分数没有人得 接下来处理分数 如有两个人得5分 即将a 5 2 记录下分数即出现次数后
  • Spring Validation 接口入参校验

    一 前言 JSR 是 Java Specification Requests 的缩写 含义为 JAVA 规范提案 JSR 303 Bean Validation 规范 正是一套基于 JavaBean 参数校验的标准 Hibernate Va
  • s3c2440移植ucGUI

    编译环境 ADS1 2 开发板 TQ2440 主要参考这篇文章 stm32 UCGUI 完美移植 ucGUI版本 3 90 ucGUI3 90下载地址 UCGUI最新3 90版源码 屏幕 联想VGA电脑屏幕 最大分辨率1024x768 1
  • vue如何编写自定义指令directive

    vue已经给我们内置了很多很好用的指令了 v mode v show 等等 但是有时候当这些指令不能满足我们需求的时候 我们还可以使用vue的自定义指令功能编写我们的指令 这是一个很强大的功能 需要说明的是 尽管自定义指令这个功能很强大 但
  • 3D MAX导出插件编写

    转 3D MAX导出插件编写 2011 6 9阅读1667 评论0 文章版权归博客园 BigCoder所有 转载请于明显位置标明原文作者及出处 以示尊重 原文出处 http www cnblogs com csyisong archive
  • 用GDB远程调试运行于QEMU的程序

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 测试环境 本文使用 Ubuntu 16 04 4 LTS QEMU 环境进行调试 3 用 GDB 调试 QEMU 内程序 3 1 编写用来调试的程序
  • 国内使用reCaptcha验证码的完整教程

    国内使用reCaptcha验证码的完整教程
  • 查看系统端口占用

    第一步 win R打开 输入cmd进入命令窗口 第二步 输入netstat ano回车 找到对应的进程PID为14472 或者采用这个方法 用 netstat ntlp 查看监听端口 无3000 第三步 输入命令tasklist回车 找到对
  • C#Expression表达式树(lambda)的使用——Parameter、Property、Call、构建Select、构建Where

    1 定义参数 Parameter 访问属性 Property private static void Main string args 1 定义参数 Parameter 访问属性 Property 定义表达式树中的参数或变量 linq表达式