Linq 表达
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 表达的更多相关文章
- c#LINQ表达树
如果你已经用过LINQ, 你应该知道函数方式,以及包含的丰富的类库, 如果你仍不了解, 那根据下面的链接去熟悉一下 the LINQ tutorial, lambda. 表达树提供了丰富的包含参数的 ...
- Linq表达树(固定参数)
这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧. 在网上看了别人的文章目前水平有限借鉴别人的思想吧 ...
- .Net 分布式云平台基础服务建设说明概要
1) 背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2) 基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3) 概要说明 基础服务的发展会根 ...
- .NET深入实战系列--EF到底怎么写过滤条件
本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: ...
- MongoDB 分页查询的方法及性能
最近有点忙,本来有好多东西可以总结,Redis系列其实还应该有四.五.六...不过<Redis in Action>还没读完,等读完再来总结,不然太水,对不起读者. 自从上次Redis之后 ...
- .NET深入实战系列--EF到底怎么写过滤条件(转)
原文来自:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// ...
- C#MongoDB 分页查询的方法及性能
传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外,针对现在的web很流行的poll/push加载 ...
- Mego(03) - ORM框架的新选择
前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...
- asp.net core系列 33 EF查询数据 (2)
一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...
随机推荐
- C Primer Plus note6
error: invalid preprocessing directive #difine| 无效的宏定义处理 宏定义define 写成了 difine.
- web前端css实现六边形效果
css六边形边框 第一步.分解图形 拆分成一个长方形和两个正方形 三角形是正方形的一半 用伪元素实现一个正方形 旋转45度(transform:rotate(45deg)) 等腰直角三角形是特殊的等腰 ...
- linux 共享目录
1. 文件上传遇到多物理机多实例时,怎么处理呢? ftp, 文件同步, 目录共享 这里用目录共享来一把. 2. 操作流程 物理机两台 192.168.1.88 192.168.1.166 2.1 服 ...
- 51Nod1601 完全图的最小生成树计数
传送门 我居然忘写题解啦!(记忆废) 不管怎么说,这题还算是一道好题啊……你觉得敦爷出的题会有水题么 …… 这题比较容易把人误导到Boruvka算法之类的东西上去(我们机房去刚D题的人一开始大多也被误 ...
- NOI.AC NOIP模拟赛R3解题报告
心路历程 预计得分:\(100+100+50=250\) 实际得分:\(10 +100 +50 = 160\) 三道原题,真好.T2做过,T1写了个错误思路,T3写了写50分状压dp. 整场考试实际在 ...
- Python-网络编程(三)
今天是网络编程的最后一天,明天会开始并发编程 socketserver模块实现并发 为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用soc ...
- Hadoop序列化程序报错
这个错误指向序列化类,注意实现的Read和Wirte顺序一定要一致,并且要使用基本类型,不要使用包装类. java.lang.Exception: java.io.EOFException at or ...
- 移动端开发:iOS与Android平台上问题列表
要CSS伪类 :active 生效,只需要给 document 绑定 touchstart 或 touchend 事件 <style> a { color: #000; } a:activ ...
- 解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的MSSCCPRJ.SCC文件或其他项可能己被删除。
Visual Studio 2015 + SVN 开发环境,今天打开项目,就报了下面这个错误,先前是好好的! 解决方案看起来是受源代码管理,但无法找到它的绑定信息.保存解决方案的源代码管理设置的MSS ...
- java jdk切换出现的问题 jdk切换失败(转)
1.问题:同时装两个版本的jdk时出现的问题(本次是1.7和1.8的版本),因为eclipse要求1.8版本的,但是我的Windows默认版本是1.7,导致无法启动eclipse 2.因为做开发的时候 ...