以下为《C#图解教程》读书笔记

LINQ是

直接嵌入C#的强类型查询语言
与LINQ相关的特性:
隐式类型的本地变量:使用var
Lamdba表达式:lambda表达式
扩展方法//写一个静态类给已知类添加方法,使用时看起来这个类里面本来就有这个方法.
匿名类型:匿名类型
 
LiNQ可应用方面:
 
LINQ语法
有两种形式语法,两着性能上没区别:
举例:
假设已定义了一个数组numbers
 
方法语法:
var A=numbers.Where(x=>x<20);
//这里用到了Lambda
 
查询语法:
var A=from n in numbers
    where n<20
    select n;
//这里返回了一个对象,这个对象能形容具体的查询步骤,这里并没有进行查询动作
 
查询变量:
查询结果一般为一组可枚举的数据或者一个叫做标量的单一值
 
一组可枚举数据:
上面的查询语法的A不包含查询结果,相反,编译器会创建能够执行这个查询的代码
标量:
 int count=(from n in numbers where n<20 select n).Count();
//这里是查询语句与方法语句的结合
count包含的是真实的整数值,它只能通过真实运行查询才能得到
 

查询表达式结构
注意事项:
  • 按照一定的顺序出现
  • from子句和select...group子句是必须的
  • 其他语句是可选的
  • select子句在表达式最后

 
from子句
from指定了查询的数据集合,每一个LINQ查询都要以from开始
语法:
frome type Item in Items
//type 是可选的,因为编译器会帮你推断
与foreach的区别
foreach指定从第一个开始到结束,from之规定集合的每一项都要访问
foreach遇到代码就执行主体,from 只是创建可执行查询的后台代码对象
 
jion 联结:
使用联结来结合多个集合的数据
联结操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合中的所有字段.
语法:
自我理解:
联结就是把join前的集合与jion后的集合合成一个集合,当然要设置一些选择条件
还是看代码说话
 
书上:
 
代码示例:
  1.  //这个代码声明了两个类
     //第一个代表学生,每个学生都有学生的名字和ID
     //第二个代表课程,每个课程类都有学生的ID和课程的名字
     class Program
     {
         public class Student
         {
             public int StID;
             public string LastName;
         }
         public class CourseStudent
         {
             public string CourseName;
             public int StID;
         }
         //在全局中创建学生类与课程类
         //课程类与学生类中有一样的ID
         static Student[] students =newStudent[]{
             ,LastName="Carson"},
             ,LastName="Klassen"},
             ,LastName="Fleming"},
         };
         static CourseStudent[] studentsInCourses =new CourseStuden t[]{
             },
             },
             },
             },
             },
         };
         static void Main()
         {
             var query =from s in students//开始查询,在一个集合内查询
                         join c in studentsInCourses on s.StID equals c.StID
                         //而这个集合是,由两个集合的部分组成,上面的意思是:
                         //定义students的迭代变量a
                         //定义studentsInCourses迭代变量c
                         //联结这连个集合中的成员,并生成新的一个集合
                         //联结结果是:把两个集合成员具有相同StID的拿出来组成一个新的集合
                         where c.CourseName=="History"
                         //找出新集合中CourseName== "History"的成员
                         select s.LastName;
                         //把这些成员的LastName返回
             foreach(var q in query)
             Console.WriteLine("Student taking History: {0}", q);
             Console.ReadKey();
         }
     }
联结过程图例:
左students右CourseName
每次拿去students的元素更CourseName比较
比较两者的StID值
阴影为联结结果
 
from... let.... where子句
 
from语句
每一个from语句都引入一个新的数据源
  1.  class Program
     {
         static void Main()
         {
             ,,,};
             ,,,};
             var someInts =from a in groupA//必须的第一个from语句
                         from b in groupB//主句中的from语句
                         select new{ a, b, sum=a+b };//创建一个匿名类型
             foreach(var a in someInts )
             Console.WriteLine( a );//很神奇,"a=","b="自动写了
         }
     }
 
let子句
接受一个表达式式的运算并且把它复制给一个需要在其他运算中使用的标示符
  1.  class Program
     {
         static void Main()
         {
             ,,,};
             ,,,};
             var someInts =from a in groupA
                         from b in groupB
                         let sum = a + b
    
                         select new{ a, b, sum };
             foreach(var a in someInts )
             Console.WriteLine( a );
         }
     }
结果:
 
where子句
where子句根据之后的运算来去除不符合指点条件的项
注意:
只要在from...let...where部分中,查询表达式可以是任意个
  1.  static void Main()
     {
         ,,};
         ,,,};
         var someInts =from int a in groupA
                     from int b in groupB
                     let sum = a + b
    
                     select new{ a, b, sum };
         foreach(var a in someInts )
         Console.WriteLine( a );
     }
orderby
orderby子句接受一个表达式并根据表达式按顺序返回结果项
表达式通常是字段,但不一定是数值型,也可以是字符串
表达式后面能跟(ascending或descending)//可选的,分别用来设置升序或者降序,默认升序
  1.  classProgram
     {
         static void Main()
         {
             var students =new[]
             {
                 ,Major="History"},
                 ,Major="CompSci"},
                 ,Major="History"}
             };
             var query =from student in students
             orderby student.Age ascending//降序descending
             select student;
             foreach(var s in query)
             {
                 Console.WriteLine("{0}, {1}: {2} - {3}",
                 s.LName, s.FName, s.Age, s.Major);
             }
             Console.ReadKey();
         }
     }
 
select...group子句
由两个部分组成select...group:
select子句和group...by子句
 
select子句
select子句指定了所选对象的哪一个部分被选择这个部分可以是:
整个数据项
数据项的一个字段
数据项的几个字段组成的新对象//匿名类型
 
group...by
group...by子句是可选的,用来指定选择项是如何被分组.
group语句吧select的对象根据一些标准进行分组,
如果仅仅写了from语句和goup by语句,返回的是IEnumerable<IGrouping<键,值>>
  1.  classProgram
     {
         static void Main()
         {
             var students =new[]
             {
                 ,Major="History"},
                 ,Major="CompSci"},
                 ,Major="History"}
             };
             var query =from student in students
                        group student by student.Major;
                        //query是返回的是IEnumerable<IGrouping<键,值>>,所以下面不能直接打印
             foreach(var s in query )
             {
                 Console.WriteLine("{0}", s.Key);//key是分组键
                 foreach(var t in s )
                 Console.WriteLine(" {0}, {1}", t.LName, t.FName);
             }
         }
     }


 
 
into子句
插叙延续子句可以接受查询的一部分结果并赋予新的名字,把它用于其它的查询
  1.  classProgram
     {
         static void Main()
         {
             ,,,};
             ,,,};
             var someInts =from a in groupA
                             join b in groupB on a equals b
                             into groupAandB
                             from c in groupAandB
                             //选中groupA与groupB相同的部分把这部分取名为grupAandB
                             select c;
             foreach(var a in someInts )
             Console.Write("{0} ", a );
         }
     }
 
 
 
 
 
Linq核心程序集

LINQ基础的更多相关文章

  1. [.net 面向对象编程基础] (19) LINQ基础

    [.net 面向对象编程基础] (19)  LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...

  2. LINQ基础概述

    介绍LINQ基础之前,首说一下LINQ 的历史和LINQ是什么,然后说一下学习 LINQ要了解的东西和 LINQ基础语法   LINQ 的历史 从语言方面的进化 –委托 –匿名方法 –Lambda表达 ...

  3. LINQ基础(二)

    本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblo ...

  4. LINQ基础(三)

    一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上. 尽管Enumerable类给IEnumerable<T& ...

  5. Linq基础操作之Select,Where,OrderBy,ThenBy源码分析

    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析 二:Select 它是延迟执行.yield有得一拼,因为他们都是生成了一个枚举类. if (source is TSo ...

  6. Linq基础必备

    1.linq基础必备之对象初始化器和匿名类型因果分析   3. 一:对象初始化器 1.就是在new的时候给公共属性赋值的一种方式 2. 在没有初始化器之前的时候,我们是怎么初始化的呢??? 1. 构造 ...

  7. 20.C#LINQ基础和简单使用(十一章11.1-11.2)

    终于看到了第11章,之前虽然也有看过,但没有太仔细,在工作中也偶尔会使用,但不明白其中的原理,那现在就来讲讲LINQ,做一做书虫~~ 首先先了解下LINQ的三个要点: LINQ不能把非常复杂的查询表达 ...

  8. LINQ之路(1):LINQ基础

    本文将从什么是LINQ(What).为什么使用LINQ(Why)以及如何使用LINQ(How)三个方面来进行说明. 1.什么是LINQ LINQ(Language Integrated Query)是 ...

  9. Linq基础知识小记四之操作EF

    1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...

  10. C#3.0新增功能09 LINQ 基础01 语言集成查询

    连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 Inte ...

随机推荐

  1. 利用 Google API 调用谷歌地图 演示1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. iOS Core Animation Advanced Techniques

    Book Descripter Core Animation is the technology underlying Apple's iOS user interface. By unleashin ...

  3. OC7_代理的基本概念

    // // Cat.h // OC7_代理的基本概念 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangxue ...

  4. linux工程管理工具make入门

    一.make工具的功能 1.主要负责一个软件工程中多个源代码的自动编译工作 2.还能进行环境检测.后期处理等工作: 3.make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文 ...

  5. JavaScript选项卡

    实现js选项卡 html的代码如下: <div class="tabdiv"> <ul class="tabs" id="oTab& ...

  6. Codevs 1097 校门外的树

    时间限制: 1 s   空间限制: 128000 KB   题目等级 : 白银 Silver   题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米 ...

  7. memory model

    最近看C++11 atomic发现对memory_order很是不理解,memory_order_relaxed/memory_order_consume/memory_order_acquire/m ...

  8. 私人定制自己的linux小系统

     私人定制自己的linux小系统 一.前言    linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在 ...

  9. 不同浏览器的DNS超时重发机制(一)

    一.Chrome浏览器(37.0.2062.124 m) 1.在Win7环境下,DNS超时重发的时间间隔为:2s.2s.2s.2s(在这个时刻重复发2个DNS请求).2s.4s,再经过大约14s左右, ...

  10. win32开发基础

    收集的,正在学习... 跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4) ...