Lambda表达式 和 Expression<T>

经常用的Lambda表达式 返回的是  Expression<T> 格式

 public class ActivityService
    {
        private readonly List<Activity> _source = new List<Activity>();

        public ActivityService()
        {
            _source.Add(new Activity()
            {
                Id = "5656d551d430520e100fa4f5"  ,
                Name="奥运会"
            });
            _source.Add(new Activity()
            {
                Id = "d702abd8",
                Name = "亚运会"
            });
            _source.Add(new Activity()
            {
                Id = "706b0ba267a9",
                Name = "美洲杯"
            });

            _source.Add(new Activity()
            {
                Id = "47d6",
                Name = "世界杯"
            });
            _source.Add(new Activity()
            {
                Id = "4a8d",
                Name = "大运会"
            });
            _source.Add(new Activity()
            {
                Id = "acdb",
                Name = "欧洲杯"
            });
        }

        public Activity GetOne(Expression<Func<Activity, bool>> where)
        {
            var func = where.Compile();
            return _source.FirstOrDefault(o => func(o));

        }
    }

  

  public class Activity
    {
        public string Id { get; set; }
        public string Name { get; set; }

    }

  

调用方式如下:

class Program
    {
        static void Main(string[] args)
        {
            ActivityService service=new ActivityService();
            string id = string.Empty;
            string name = "大运会";

            //表达式不支持语句块
            Expression<Func<Activity, bool>> expression =
                (Activity a) => string.IsNullOrEmpty(id) ? a.Name == name : a.Id == id;

            //如果需要语句块 可以直接使用委托,然后有2种方法 (1)将其封装到Excepression (2)直接使用Lambda表达式
            Func<Activity, bool> func = (a) =>
            {
                if (!string.IsNullOrEmpty(id))
                    return a.Id == id;
                return a.Name == name;
            };
            //expression = (Activity a) => func(a);
            //或者直接在下面使用Lambda
            var activity2 = service.GetOne( (a)=>func(a));

            var activity = service.GetOne(expression);
            Console.Read();
        }
    }

  

时间: 2024-10-01 02:24:08

Lambda表达式 和 Expression<T>的相关文章

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

[C#] C# 知识回顾 - 表达式树 Expression Trees

C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达式树 调试 简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等. 你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库中执行 LINQ 查询以及创建动态查询. 表达式树还能用于动态语言运行时 (DLR) 以提供

基类的参考Expression能传一个lambda表达式

using System;using System.Collections.Generic;using System.Data.Entity.Infrastructure;using System.Linq;using System.Linq.Expressions;using System.Text; namespace P04DAL{ /// <summary> /// 用户表 操作类/// </summary> public class User { /// <summ

lambda表达式Expression&lt;Func&lt;Person, bool&gt;&gt; 、Func&lt;Person, bool&gt;区别

前言: 自己通过lambda表达式的封装,将对应的表达式转成字符串的过程中,对lambda表达式有了新的认识 原因: 很多开发者对lambda表达式Expression<Func<Person, bool>> .Func<Person, bool>表示存在疑惑,现在就用代码举个简单列子 原代码: using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expres

在EF中使用Expression自动生成p=&gt;new Entity(){X=&quot;&quot;,Y=&quot;&quot;,..}格式的Lambda表达式灵活实现按需更新

一.基本介绍      回忆:最早接触Expression是在学校接触到EF的时候,发现where方法里的参数是Expression<Func<T,bool>>这么一个类型,当初也只是看到了,也没有过多的去探究,只是知道传入lambda表达式使用即可,对于Expression和里面的Func<T,bool>到底是怎么一种关系,都不清楚.目前也不是很了解,只知道一些简单的使用,但是可以解决自己目前的一些问题就好了.毕竟作为一名18年的应届毕业生,能力有限. 今天,就简单的

C++11 lambda表达式(lambda expression)

1.可调用对象(callable object)类别包括: 函数 函数指针 重载了函数调用运算符的类 lambda 表达式 2.lambda表达式形式: [capture list] (parameter list) -> return type { function body } capture list (捕获列表)是一个 lambda 所在函数中定义的局部变量的列表(通常为空),空捕获列表表明此 lambda 不使用它所在的函数中的任何局部变量, return type.parameter

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低. 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低. 1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大. 1.4.本着 write less  do more

兰姆达表达式Lambda 表达式(C# 编程指南)

转https://msdn.microsoft.com/zh-cn/library/bb397687.aspx Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda 表达式 x => x

JDK8新特性 Lambda表达式

一.接口的默认方法二.Lambda 表达式三.函数式接口四.方法与构造函数引用五.Lambda 作用域六.访问局部变量七.访问对象字段与静态变量八.访问接口的默认方法九.Date API十.Annotation 注解:支持多重注解 一.接口的默认方法 Java8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: [java] view plain copy public interface Formula { double calcu