linq to entity 基础
部分摘抄 http://www.cnblogs.com/nikymaco/archive/2012/07/11/2585594.html
linq(语言集成查询)在对象领域和数据领域之间架起了一座桥梁。
一.每个LINQ语句都以from作为开头,以select作为结束.
1.语法关键字
from : 指定数据源和范围变量(类似于迭代变量)。
where: 根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。
select: 指定当执行查询时返回的序列中的元素将具有的类型和形式。
group: 按照指定的键值对查询结果进行分组。
into: 提供一个标识符,它可以充当对 join、group 或 select 子句的结果的引用。
orderby: 基于元素类型的默认比较器按升序或降序对查询结果进行排序。
join: 基于两个指定匹配条件之间的相等比较来联接两个数据源。
let: 引入一个用于存储查询表达式中的子表达式结果的范围变量。
in: join 子句中的上下文关键字。
on: join 子句中的上下文关键字。
equals: join 子句中的上下文关键字。
by: group 子句中的上下文关键字。
ascending:orderby 子句中的上下文关键字。
descending:orderby 子句中的上下文关键字。
2.linq常用到的特性:
①. 匿名类型:
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。例如:var obj = new {A="a", B="b"}; 而LINQ则可以为 var nums = from obj in objs select new {obj.A, obj.B}
3. LINQ 查询操作包含三个操作:获得一个或多个数据源、创建查询并执行查询。可以通过 LINQ 查询实现 IEnumerable 泛型接口或 IQueryable 泛型接口的数据源。 ObjectQuery 泛型类(可实现 IQueryable 泛型接口)的实例可充当 LINQ to Entities 查询的数据源。
①. IEnumerable<T> 泛型接口:公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。IEnumerable<T> nums = from n in nums where .... orderby... select...
②.IQueryable 泛型接口:提供对数据类型已知的特定数据源的查询进行计算的功能。
4.查询:
下面是基本操作:
内联查询
var query= from obj1 in objs1 join obj2 in objs2 on obj1.ID equals obj2.ID select new { A= obj1.Property, B = obj2.Property };
左外联查询
var query = from obj1 in objs1 join obj2 in objs2 on obj1.ID equals obj2.Obj1ID into g from subpet in g.DefaultIfEmpty() select new { P1 = obj1.P1, P2 = (subpet == null ? null : subpet.P2 ) };
分组查询
var query = from obj in objs group obj by obj.PropertyA into g orderby g.Key select g;
注意,在此示例里,关键字 into 不是必须的,使用 into 时,必须继续编写该查询,并最终用一个 select 语句或另一个 group 子句结束该查询。
LINQ的涉及应用如:linq to sql, lint to entites, linq to xml, linq to dataset 等等
5.linq的延迟加载:延迟执行意味着表达式的计算延迟,直到真正需要它的实现值为止。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 已知一个序列 2 var array = new int[] {1, 2, 3}; 3 4 // 编写一段LINQ表达式获得一个序列变量query 5 // 注意,这个变量仅仅是一个代理,在执行编译的时候,编译器检查完 6 // 该代码的正确性后直接跳过,不再理会 7 var query = from arr in array 8 where arr > 1 9 select arr; 10 11 // 调用上述序列变量query,此时上述的LINQ表达才会执行。注意此时已是在 12 // 编译器Runtime 的情况下执行 13 foreach(var q in query) 14 Console.WriteLine(q.ToString());