首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

LinQ体味

2012-10-27 
LinQ体验前面两章写了扩展方法和Lambda表达式,其实真正的主角现在出场了,那就是曾经有人问我,你会LinQ吗?L

LinQ体验
前面两章写了扩展方法和Lambda表达式,其实真正的主角现在出场了,那就是曾经有人问我,你会LinQ吗?
LinQ(Language Integrated Query)语句集成查询。.NET Framework3.5中的最亮点。
不说了,直接上例子。相信大家都能看明白
 


该查询表达式包含三个子句:from、where 和 select。 (如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句应用筛选器,select 子句指定返回的元素的类型。目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。延迟执行
如前所述,查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”,有“延迟执行”也就有“强制执行”

强制立即执行
对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。 Count、Max、Average 和 First 就属于此类查询。 由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。 另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。 下面的查询返回源数组中偶数的计数:

private IList<T> Test(){  List<int> numQuery2 =       (from num in numbers        where (num % 2) == 0        select num).ToList();      // or like this:      // numQuery3 is still an int[] }private Array Test1(){    var numQuery3 =        (from num in numbers         where (num % 2) == 0         select num).ToArray() }

此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。 但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。

总结:LinQ的方法语法和查询语法之间并无语义上的区别。CLR本身并不理解查询语句,它只理解查询方法,编辑器负责在编译时将查询语句翻译为查询方法.大部分查询方法都有对应的查询语句,如select()对应select,where()对应where,order()对应order。部分查询方法目前c#中还没有查询语句,如count()和max()这时只能采用
查询方法
查询语句+查询方法混合的模式
一般情况下,见议使用可读性更高的查询语句。而且这里只是一些简单的使用说明,更多的内容还需要以后慢慢的研究积累。

热点排行