Linq(1)
延迟执行。
deferred execution
The query variable itself only stores the query; it does not execute the query or store the result.
可以使用 query variable 多次执行,很像是委托的实现。
Deferred execution works regardless of whether you are using the query or method syntax.
One way to force an immediate execution of the query is to explicitly convert the query result into a List object.
这个时候variable 存储的是执行的结果,
*IEnumerable<> 作为返回值,是如何保存查询命令的呢?
*如何进行优化的呢?
*!!!这个就是传说中的表达式缓存吗?
1.可以在select部分使用
select new {}这样,创建新的匿名类型来简化操作,但是这样有个问题,就是这个类型是系统临时生成的,不会和实际的类型对应。
From: 指定了查询的数据源,并声明了局部变量
Where : 指定了查询的条件,并且多个条件可以用 && || .
Orderby : 排序条件
Select : 指定需要返回的结果,可以是实体集合,也可以是某个属性
如果是返回多个属性,但不是整个实体,有两种方式:
1.Use IEnumerable ,定义一个命名类型。 IEnumerable, select new{ a=c.a,b=c.b }
2.use anonymous type,Var select new{c.a ,c.b,c.c}
那么这两种方式的区别呢?也就是使用命名实体,和匿名实体的区别。
Linq to All核心:
1. Linq Providers : IQueryable
2. Expression Trees:表达式树,用于把linq语句(IQueryable),lambda 表达式 转换为 编译器可执行的语句。
IQueryable<T>
Keep in mind the term :execute an expression tree is specific to the query provider.
IEnumerable包含了大量的方法,大部分和sql对应的方法,有一些可以使用query语法,其他的使用method语法,并且还包括了大量的转换方法,定位集合元素的方法,集合元素获取方法。
表达式树与Lambda
一。Expression Tree <----------------Lambda
Expression<Func<int,bool>> e1 = num=> num>2;
表达式树是lambda的数据表现。
二。Expression Tree ---------------->Lambda
运行时创建表达式树。