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 查询 ...
随机推荐
- 自定义控件实现-今日头条Android APP图集效果
前提 产品有个新需求,类似今日头条的图集效果 大致看了下UI,大致就是ViewPager,横向滑动切换图片,纵向滑动移动图片,纵向超过一定距离,图片飞出,图集淡出动画退出,支持图片的双击放大. 思路 ...
- ugui之圆角矩形头像实现
这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...
- 第2章 css边框属性
圆角效果 border-radius border-radius是向元素添加圆角边框. 使用方法: border-radius:10px; /* 所有角都使用半径为10px的圆角 */ border- ...
- 理解Canvas原理
Canvas原理 Canvas我们把它翻译成画布,从字面意思我们就可以知道,不就是可以在上面画东西的布吗.好像很简单,没什么好说的.先看图: 从这几幅图我们可以看到以下几点: 1.每个小方格我们可以看 ...
- [转载]hive中order by,sort by, distribute by, cluster by作用以及用法
1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...
- 22_CopyOnWrite容器
[简述] Copy-On-Write简称COW,是一种程序设计中的优化策略. JDK里的COW容器分为两种:CopyOnWriteArrayList 和 CopyOnWriteArraySet. Co ...
- 基于以太坊的Token开发步骤
Token开发步骤 一.准备工具1.安装以太坊brew tap ethereum/ethereumbrew install ethereum2.node:brew install nodejs3.安装 ...
- linux下安装及配置jenkins
jenkins常用的有两种安装方式: 1.直接下载war包jenkins.war,下载地址https://jenkins.io/download 直接下载 1.1.可以把war包直接部署到servle ...
- npm install warning: no description; no repository field
npm install 报错:warning no description; no repository field 开始以为必须npm init,npm init在git bash(win7)里,还 ...
- jquery之---$.each详细
jQuery.each()函数用于遍历指定的对象和数组,并以对象的每个属性(或数组的每个成员)作为上下文来遍历执行指定的函数. 语法 静态函数$.each()的语法如下:$.each( object, ...