LinQ 学习笔记

书: LINQ高级编程 (Professional LINQ) By Scott Klein


今天看了书的1~4章,觉得作者很奇怪,为什么代码有时候是C#的,有时候又是VB得?幸好我懂VB,不然的话,看到被C#所不齿的VB代码,肯定会像吃了苍蝇那般的恶心。可以肯定的是,这不是一本好书!没看到什么亮点,作者也没有很深入的讲解LINQ的底层实现,很对不起Pro这个词!所幸的是,纸张质量还是不错的,字体很大,看着很舒服。


  • LinQ可以应用于实现了IEnumerable<T>和IQueryable<T>的数据源,包括数组。那么实现IEnumerable和IQueryable的可以吗?不可以!
  • Lamda表达式,返回的是一个代理对象。
  • LinQ表达式本身不执行任何查询,而只是定义查询,在随后对表达式进行For each枚举的时候,才会真正去执行。同时作者指出,是在第一次调用MoveNext()的时候执行真正的查询,这个有待验证。不是GetEnumerator()吗?不是!
  • LinQ分成表达式和方法两种。表达式就是通过关键字(from xxx in xxx where xxx select xxx)定义查询,而方法么就是(xxx.Where(xxx).Select(xxx))直接执行查询,作者指出,LinQ表达式在编译的时候,会被编译成LinQ方法,经过验证,.Net Reflector在使用.Net 3.5会反编译成LinQ表达式,使用.Net 2.0则编译成LinQ方法,但是可以看到.Net创建了一些static的方法,对应LinQ的各个表达式(还有代理)。
  • LinQ表达式和T-SQL有点不一样,就是T-SQL把select语句放在最前面,而LinQ却把from放在最前面,这个一直让我记不起怎么写LinQ表达式!作者指出,数据库里面对T-SQL表达式的翻译其实是从From子句开始的,Select在蛮后面的。This makes sense! 那么,我就可以自欺欺人的理解LinQ这样的设计是为了性能考虑吧(或者是编译器性能?因为LinQ表达式最终会被翻译成方法嘛,哈哈)
  • Union与Concat区别是Union返回不重复的项目。

原文地址:https://www.cnblogs.com/puncha/p/3876972.html