概述

  在开发工作中,有些时候需要对一些增删改查进行封装(用 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 表达式的更多相关文章

  1. Lambda表达式动态组装查询条件

    最近比较闲,年底了,项目也进入尾声:每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思: 问题 在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么 ...

  2. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  3. Lambda表达式的前世今生

    Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...

  4. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

  5. 行为参数化和Lambda表达式

    行为参数化是指拿出一个代码块把他准备好却不执行它.这个代码块以后可以被程序的其他部分调用,意味着你可以推迟这块代码的执行.方法接受多种行为作为参数,并在内部使用来完成不同的行为.行为参数话的好处在于可 ...

  6. Java8特性Lambda表达式

    Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parame ...

  7. C++11 — lambda表达式(匿名函数)

    C++11中lambda表达式的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } 其中 [] 内为外部变量的传递方式: [] ...

  8. Consumer方法结合Lambda表达式的应用

    package com.itheima.demo05.Consumer;import java.util.function.Consumer;/** * @author newcityman * @d ...

  9. .net lambda表达式合并

    事情的起因是公司一个小伙子问了我个问题 "海哥,来帮我看下这段代码怎么不行" Func<Report,bool> nameFilter = x=>x.Name = ...

随机推荐

  1. 百度API经纬度和地址互相查询

    /** * 获取地址对应的坐标 * @param $address * @return array */ function getAddressPoint($address){ $lng = 0; $ ...

  2. P1342 请柬

    最近一直在做最短路......所以今天就再做一道最短路吧.... 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片 ...

  3. linux系统安装MongoDB

    1.在官网https://www.mongodb.org/dl/linux/x86_64下载对应的安装压缩包,我用的是3.2.5,建议使用此版本,版本越高,可能会出现其它未知问题,比如需要glibc高 ...

  4. CLASS类继承

    单继承:# class People: 经典类class People(object): #新式类 def __init__(self,name,age,n=1000): self.name = na ...

  5. vue.js使用vue-preview做移动端缩略图时报错Property or method "$preview" is not defined

    报错的详细信息为: Property or method "$preview" is not defined on the instance but referenced duri ...

  6. win7有多条隧道适配器(isatap、teredo、6to4)的原因及关闭方法

    问题:sdp协商时,带有IPV6的信息,需要将IPV6相关信息去掉 原因:网卡启用了ipv6通道 解决:关闭IPv6数据接口 netsh interface isatap set state disa ...

  7. 01: 腾讯云API-云服务器

    1.1 云服务器 1.腾讯云SDK使用举例 网址:https://cloud.tencent.com/document/sdk/Python #! /usr/bin/env python # -*- ...

  8. 算法(第四版)C# 习题题解——2.2

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...

  9. html5 浏览文件

    var fileInput = document.getElementById('test-image-file'), info = document.getElementById('test-fil ...

  10. Android中本地广播的实现

    其实Android的本地广播并没有什么好讲的,他就是用了一个localbroadcastmanager类来sendbroadcast,以及注册和注销广播,没有什么特点,其中实例该类的时候用了getin ...