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

news/2024/10/1 7:40:59

 

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

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

方法和步骤:

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

详细实例源代码:

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:创建第一个表达式,检查年龄是否大于等于 18Expression<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)); // 输出 TrueConsole.WriteLine(compiledExpression(person2)); // 输出 False}
}

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处理国…

Rocketmq 不同的topic要配不同的consumegroup

Rocketmq 不同的topic要配不同的consumegroup 使用Rocketmq一定要注意,如果项目中要订阅两个topic,一定要保证consumeGroup是两个不同的。这是因为,Consumer会定期发送心跳,默认是30s一次。心跳会像全部broker发送,心跳包内容包括groupname,topicname1。然后broker端会缓…

Fastjson反序列化漏洞

与原生的 Java 反序列化不同,FastJson 反序列化并未使用 readObject 方法,而是自定义了反序列化的过程Fastjson简介 Fastjson是一个Java库,可以实现json和对象之间的转换。 将数据与对象进行转化,这个操作涉及到了反序列化。 与原生的 Java 反序列化不同,FastJson 反序列化…

mysql事务

1. 事务事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 2. 控制事务控制事务一查看/设置事务提交方式SELECT @@autocommit ;SET @@autocommit = 0 ;提交事务COMMIT…

2022年windows的Visual Studio常用插件及使用手册

前景提要Viusual Studio 是一款很好用的C/C++集成开发工具,具有强大的扩展功能,好用的插件,但是,很多人都是只写了有什么插件,但是,没写怎么使用这种插件,使得使用的时候很是不方便,所以,笔者最近本着自己的学习,在这里写下自己关于好用的插件的研究,希望对您的学习/工作有帮助…

JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)

一、简介Map就是用来存储“键(key)-值(value)”对的. 通过键寻找value,所以键不能重复. 数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便. 实际开发中较为常用.二、Map的常用方法实例(1)存…

Oracle修改字段长度及属性

首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486117&idx=1&sn=02e2cd05e5db7eaa5758c70e81cf3972&chksm=ea375ed5dd40d7c367727562bdb00788f3bd139cbbda377f599586a47ce13ad9d04c56fd4d2d&token…

C#/.NET/.NET Core优秀项目和框架2024年4月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项…