合并两个 Lambda 表达式
概述
在开发工作中,有些时候需要对一些增删改查进行封装(用 Lambda 表达式来筛选数据),但是又有一部分条件总是相同的,对于相同的部分可以直接写到方法里,而不同的部分作为参数传进去。
定义扩展方法:
public static class Ext
{
public static Expression<Func<T, bool>> AndAlso<T>( this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
{
var p = Expression.Parameter(typeof(T), "x");
var bd = Expression.AndAlso(Expression.Invoke(a, p), Expression.Invoke(b, p));
var ld = Expression.Lambda<Func<T, bool>>(bd, p);
return ld;
}
}
定义 Person 类
class Person
{
/// <summary>
/// 性别
/// </summary>
public string Sex { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 身高
/// </summary>
public int Height { get; set; }
}
扩展方法调用
List<Person> persons = new List<Person>()
{
new Person{ Sex = "男", Age = , Height = },
new Person{ Sex = "男", Age = , Height = },
new Person{ Sex = "男", Age = , Height = },
new Person{ Sex = "女", Age = , Height = },
new Person{ Sex = "女", Age = , Height = }
}; Expression<Func<Person, bool>> e1 = p => p.Age >= && p.Sex == "男";
Expression<Func<Person, bool>> e2 = p => p.Height > ; Expression<Func<Person, bool>> e3 = e1.AndAlso(e2);
var ls = persons.Where(e3.Compile()).ToList();
扩展使用
在上述例子中,通过扩展方法可以进行以下使用:封装一个方法,参数类型为 Expression<Func<Person, bool>> ,然后,将 e2、e3 及查询过程封装到方法里面,这样查询的时候只需要传入参数 “p => p.Age >= 21 && p.Sex == "男"”就可以实现上述实例中的查询。
合并两个 Lambda 表达式的更多相关文章
- Lambda表达式动态组装查询条件
最近比较闲,年底了,项目也进入尾声:每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思: 问题 在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么 ...
- Util应用程序框架公共操作类(七):Lambda表达式公共操作类
前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...
- Lambda表达式的前世今生
Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...
- 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测
概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...
- 行为参数化和Lambda表达式
行为参数化是指拿出一个代码块把他准备好却不执行它.这个代码块以后可以被程序的其他部分调用,意味着你可以推迟这块代码的执行.方法接受多种行为作为参数,并在内部使用来完成不同的行为.行为参数话的好处在于可 ...
- Java8特性Lambda表达式
Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parame ...
- C++11 — lambda表达式(匿名函数)
C++11中lambda表达式的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } 其中 [] 内为外部变量的传递方式: [] ...
- Consumer方法结合Lambda表达式的应用
package com.itheima.demo05.Consumer;import java.util.function.Consumer;/** * @author newcityman * @d ...
- .net lambda表达式合并
事情的起因是公司一个小伙子问了我个问题 "海哥,来帮我看下这段代码怎么不行" Func<Report,bool> nameFilter = x=>x.Name = ...
随机推荐
- centos7安装git
1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...
- maven的两种打包插件 ,防止 将无用文件打入META_INF,找不到主类的问题
第三种 打依赖包 将依赖其他jar的包都打进去 <plugin> <artifactId>maven-assembly-plugin</artifactId> &l ...
- JAVA中for与while关于内存的细节问题
文/朱季谦 JAVA的程序结构有顺序结构,循环结构,分支结构,以及跳转结构,而循环结构里经常用到的无外乎有以下几种:for循环,while循环,以及do-while循环.本文主要讨论for循环与whi ...
- vue配置404页面
{ path:'*', name:"/404", component:cuowu } path星号表示没有这个路由 name表示去这个地址 component这个页面引入的时候叫的 ...
- vue环境命令
1.下载安装note.js用于VUE开发环境 2.VUE项目开发环境安装依赖,命令行进入项目代码目录下执行如下命令npm install 3.开发环境运行npm run dev 4.打包项目npm r ...
- 为KindEditor 添加“一键去除空格功能”
环境说明:KindEditor 4.1.11 一.确定你在使用KindEditor时,引用的是kindEditor-all.js,找到任何一个已经存在的功能,例如,清除HTML代码,我在做的时候本来 ...
- markdown test2
#home { width: auto; margin: 0 80px 0 0; } mkdir test. #include <msxml6.h> // 含有 MSXML最新版 #inc ...
- Pycharm,Python 安装OpenCV and CV2 时,报错,教你如何正确安装。
Collecting cv2 Could not find a version that satisfies the requirement cv2 (from versions: ) No matc ...
- Ubuntu 18.04 LTS 常用软件安装杂记
之前个人笔记本装的是 Linux Mint,用了一段时间但是体验不佳,所以打算换成 Ubuntu .作为一个 Linux 小白,当时配置一些软件环境费了不少时间.这次打算简单记录下,和大家分享一下我的 ...
- [译]RabbitMQ教程C#版 - 远程过程调用(RPC)
先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...