首页 > 编程语言 >C#动态查询:巧用Expression组合多条件表达式

C#动态查询:巧用Expression组合多条件表达式

时间:2024-05-10 09:13:37浏览次数:13  
标签:AndAlso C# parameter Person 步骤 Expression 表达式 巧用

 

概述:在C#中,通过`Expression`类、`AndAlso`和`OrElse`方法可组合两个`Expression<Func<T, bool>>`,实现多条件动态查询。通过创建表达式树,可轻松构建复杂的查询条件。

在C#中,可以使用AndAlso和OrElse方法组合两个Expression<Func<T, bool>>类型的表达式。以下是详细解释和实例源代码:

方法和步骤:

  1. 使用Expression类创建表达式树。
  2. 使用AndAlso和OrElse方法组合两个表达式。

详细实例源代码:

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // 步骤1:定义Person类
        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        // 步骤2:创建Expression参数
        ParameterExpression parameter = Expression.Parameter(typeof(Person), "p");

        // 步骤3:创建第一个表达式,检查年龄是否大于等于 18
        Expression<Func<Person, bool>> ageExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.GreaterThanOrEqual(
                Expression.Property(parameter, nameof(Person.Age)),
                Expression.Constant(18)
            ),
            parameter
        );

        // 步骤4:创建第二个表达式,检查姓名是否为 "John"
        Expression<Func<Person, bool>> nameExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.Equal(
                Expression.Property(parameter, nameof(Person.Name)),
                Expression.Constant("John")
            ),
            parameter
        );

        // 步骤5:组合表达式,要求年龄大于等于 18 且姓名为 "John"
        Expression<Func<Person, bool>> combinedExpression = Expression.Lambda<Func<Person, bool>>(
            Expression.AndAlso(ageExpression.Body, nameExpression.Body),
            parameter
        );

        // 步骤6:编译并使用组合后的表达式
        var compiledExpression = combinedExpression.Compile();

        // 步骤7:创建Person对象并测试
        var person1 = new Person { Name = "John", Age = 20 };
        var person2 = new Person { Name = "Alice", Age = 25 };

        Console.WriteLine(compiledExpression(person1)); // 输出 True
        Console.WriteLine(compiledExpression(person2)); // 输出 False
    }
}

在这个例子中,AndAlso方法用于将两个表达式组合成一个逻辑与的表达式。创建了两个简单的表达式来检查年龄和姓名条件,然后通过AndAlso方法组合成一个新的表达式。最后,使用Compile方法将组合后的表达式编译为委托,可以用于实际的数据测试。

 

标签:AndAlso,C#,parameter,Person,步骤,Expression,表达式,巧用
From: https://www.cnblogs.com/hanbing81868164/p/18183514

相关文章

  • Rust工作空间(workspace)实践
    本文将介绍如何使用cargoworkspace来管理多个package,并通过实践介绍workspace的一些基础场景下的使用、配置方式。在rust中编写某些中小型项目时,我们通常不会将一个工程拆分为多个package,而是通过一个package下不同的目录模块来实现模块拆分,尽管大部分场景下这种开发方式已经足......
  • centos制作具备telnet和ping功能的docker镜像
    第一步:制作Dockerfile   Dockerfile具体内容如下所示#使用官方CentOS镜像作为基础镜像FROMcentos:7#安装telnetRUNyum-yupdate&&yumcleanall&&\yum-yinstalltelnet&&\yumcleanall#安装pingRUNyum-yupdate&&yumclean......
  • C#/.NET/.NET Core优秀项目和框架2024年4月简报
    前言公众号每月定期推广和分享的C#/.NET/.NETCore优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码......
  • dremio CatalogMaintenanceService 服务简单说明
    说明此服务是从25.0开始包含的,同时在releasenote中也有说明,以下主要说明下内部实现release信息如下,具体就不翻译了,主要是添加了一个每个任务进行每个view最大保留50个历史信息Addeddailycatalogmaintenancetaskstotrimhistoryofviewstoamaximumof50......
  • Oracle修改字段长度及属性
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486117&idx=1&sn=02e2cd05e5db7eaa5758c70e81cf3972&chksm=ea375ed5dd40d7c367727562bdb00788f3bd139cbbda377f599586a47ce13ad9d04c56fd4d2d&token=1479964665&la......
  • Rocketmq 不同的topic要配不同的consumegroup
    Rocketmq不同的topic要配不同的consumegroup使用Rocketmq一定要注意,如果项目中要订阅两个topic,一定要保证consumeGroup是两个不同的。这是因为,Consumer会定期发送心跳,默认是30s一次。心跳会像全部broker发送,心跳包内容包括groupname,topicname1。然后broker端会......
  • 《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记
    论文标题《DecoupledOptimisationforLong-TailedVisualRecognition》长尾视觉识别的解耦优化作者CongCong、ShiyuXuan、SidongLiu、ShiliangZhang、MauricePagnucco和YangSong、来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处理国家......
  • CMC-MES-怎么检查服务器的端口是否开放
    检查服务器端口是否开放可以通过多种方法实现,包括使用命令行工具、网络扫描工具或在线服务。以下是一些常用方法: 1.使用命令行工具1.1. telnettelnet 是一个非常基础的工具,可以用来检查指定端口的开放状态。不过,telnet 可能不是默认安装在所有操作系统上。telnet[服务......
  • 从零手写实现 tomcat-07-war 如何解析处理三方的 war 包?
    创作缘由平时使用tomcat等web服务器不可谓不多,但是一直一知半解。于是想着自己实现一个简单版本,学习一下tomcat的精髓。系列教程从零手写实现apacheTomcat-01-入门介绍从零手写实现apacheTomcat-02-web.xml入门详细介绍从零手写实现tomcat-03-基本的socket实......
  • Scurm冲刺第四天
    Scurm冲刺第四天1.站立式会议内容昨日已完成任务今日计划完成任务首页代码设计实现前端UI设计代码编写(收藏页面,商品详情页,个人中心页)后端用户功能模块的购物车,收藏和个人中心操作功能后端管理员模块功能实现(登录注册功能,用户管理功能,个人中心操作)跟进前后端......