Lambda 简单了解

      //Lambda 

            //匿名方法
//delegate (Student s) { return s.Age > 12 && s.Age < 20; };
//Lable 表达式 (代替了上面的)
//s => s.Age > 12 && s.Age < 20 //在Lambda Expression 中指定多个参数
//(s, youngAge) => s.Age >= youngage;
//指定参数类型
//(Student s, int youngAge) => s.Age >= youngage; //没有参数的Lambda表达式
//() => Console.WriteLine("Parameter less lambda expression") //多语句Lambda表达式
//(s, youngAge) =>
//{
// Console.WriteLine("Lambda expression with multiple statements in the body");
// Return s.Age >= youngAge;
//}

将Lambda表达式分配给委派

lambda表达式可以分配给Func<in T, out TResult>类型委托。Func委托中的最后一个参数类型是返回类型,其余是输入参数。而Action<int T> 类型委托,只有输入参数,不返回。

例如:

  Func<Student, bool> isStudentTeenAger = x => x.Age >  && x.Age < ;
Student std = new Student { Age = };
bool isTeen = isStudentTeenAger(std);//false

这个委托我们可以来用方法表示

 bool isStudentTeenAger(Student s)
{
return s.Age > && s.Age < ;
}

Action:

  Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);
Student std = new Student() { StudentName = "Bill", Age = };
PrintStudentDetail(std);//output: Name: Bill, Age: 21

Linq中的Func:

  IList<Student> studentList = new List<Student>() {
new Student { Age=, StudentName="sealee" },
new Student { Age=, StudentName="sealee2" },
}; Func<Student, bool> isStudentTeenAger = s => s.Age > && s.Age < ;
var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();

LINQ中的表达式

我们已经了解到lambda Expression可以分配给Func或Action类型委托来处理内存中的集合。.NET编译器在编译时将分配给Func或Action类型委托的lambda表达式转换为可执行代码。

LINQ引入了名为Expression的新类型,它表示强类型的lambda表达式。这意味着lambda表达式也可以分配给Expression <TDelegate>类型。.NET编译器将分配给Expression <TDelegate>的lambda表达式转换为表达式树而不是可执行代码。

  //定义表达式
//Func 方法
// Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;
//使用Expresson包装Func委托将上述Func类型委托转换为表达式,如下所示:
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > && s.Age < ; //调用表达式
Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile();
//Invoke
bool result = isTeenAger(new Student() { ID = , StudentName = "Steve", Age = });

使用:

  //IEnumerable  studentList
IList<Student> studentList = new List<Student>() {
new Student { Age=, StudentName="sealee" },
new Student { Age=, StudentName="sealee2" },
};
Func<Student, bool> isStudentTeenAger = s => s.Age > && s.Age < ;
//OutDto 是我们自己定义的返回类 实际情况一般针对我们的返回接口都会生成一个单独的Dto来返回
Expression<Func<Student, OutDto>> outDto =
s => new OutDto { AAgeDto = s.Age, StudentNameDto = s.StudentName };
var teenStudents = studentList.Where(isStudentTeenAger).AsQueryable().Select(outDto);
//AsQueryable 注意这里,select(Expression) 需要我们是IQueryable
//IEnumerable 使用的是 Func
//IQueryable 使用的是 Expression<Func

Linq 表达的更多相关文章

  1. c#LINQ表达树

    如果你已经用过LINQ, 你应该知道函数方式,以及包含的丰富的类库, 如果你仍不了解, 那根据下面的链接去熟悉一下 the LINQ tutorial,  lambda. 表达树提供了丰富的包含参数的 ...

  2. Linq表达树(固定参数)

    这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧. 在网上看了别人的文章目前水平有限借鉴别人的思想吧 ...

  3. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  4. .NET深入实战系列--EF到底怎么写过滤条件

    本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: ...

  5. MongoDB 分页查询的方法及性能

    最近有点忙,本来有好多东西可以总结,Redis系列其实还应该有四.五.六...不过<Redis in Action>还没读完,等读完再来总结,不然太水,对不起读者. 自从上次Redis之后 ...

  6. .NET深入实战系列--EF到底怎么写过滤条件(转)

    原文来自:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// ...

  7. C#MongoDB 分页查询的方法及性能

    传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外,针对现在的web很流行的poll/push加载 ...

  8. Mego(03) - ORM框架的新选择

    前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...

  9. asp.net core系列 33 EF查询数据 (2)

    一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...

随机推荐

  1. PHP获取当前时间戳

    PHP提供了专门的获取当前时间戳的函数,那就是time()函数.   time()函数获取当前的UNIX时间戳,返回值为从时间戳纪元(格林威治时间1970年1月1日 00:00:00)到当前的秒数.  ...

  2. laravel后台注册登入

    1.只需要在新安装的 Laravel 应用下运行 php artisan make:auth 和 php artisan migrate,这两个命令会生成用户登录注册所需要的所有东西 2.你会发现 h ...

  3. Hibernate 注解(Annotations 一)

    1. @Entity 将一个类声明为一个实体bean(即一个持久化POJO类). 2. @Table 声明了该实体bean映射指定的表(table),目录(catalog)和schema名字 3. @ ...

  4. javascript时间格式转换(今天,昨天,前天)

    function transDate() { var $time =document.getElementById("share-time"); var date = $time. ...

  5. js数组与字符串处理 slice、splice、substring、substr、push、pop、shift、reverse、sort、join、split

    数组 方法 1.在数组末尾添加.删除元素 push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度.改变原数组 pop()方法则从数组末尾移除最后一个元素,减少数组的 ...

  6. UTF8文件带BOM引起的问题

    起因是公司iOS端竟然加载除了HTML代码,百思不得其解,查文献,原来如此... UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF ...

  7. ASPF(Application Specific Packet Filter)

    ASPF ASPF(Application Specific Packet Filter)是针对应用层的包过滤,其原理是检测通过设备的报文的应用层协议信息,记录临时协商的数据连接,使得某些在安全策略中 ...

  8. 二维码Zxing&Zbar

    二维码Zxing&Zbar 前言:该项目主要介绍了二维码扫描.闪光灯开启.本地二维码图片识别.二维码生成.分别是zxing和zbar(网格二维码)分别实现,具体效果运行项目apk... 开发环 ...

  9. linux crontab 的使用

    linux crontab 的使用 准备(实验楼需要,实际环境不需要):sudo service rsyslog startsudo cron -f & crontab 使用添加任务:cron ...

  10. 使用jQuery操作input的value值

    表单控件是我们的重中之重,因为一旦牵扯到数据交互,离不开form表单的使用,比如用户的注册登录功能等 那么通过上节知识点我们了解到,我们在使用jquery方法操作表单控件的方法: $(selector ...