Linq总是没有系统的学习,现在记录一下吧。
1.Linq开发的目的,是为了和SQL查看数据库一样,方便用来查看对象或者结构中的数据。
2.匿名类(常用于保存Linq查询结果),
构造方式:
var student=new{Name="Mary Jones",Age=19,Major="History"}; 其属性为只读, 3.我们在写LINQ查询时可以使用两种形式的语法:方法语法和查询语法。
- 方法语法(method syntax)使用标准的方法调用。这些方法是一组标准查询运算符的方法
- 查询语法(query syntax)看上去和SQL语句相似
- 在一个查询中可以组合两种形式
方法语法是命令式(imperative)的,它指明了查询方法调用的顺序。
查询语法是声明式(declarative)的,即查询描述的是你想返回的东西,但并么有指明如何执行这个查询。查询语法: var numsQuery=from n in numbers where n<20 select n;(编译器会将查询语法翻译成方法语法)
方法语法: var numsMethod=numbers.Where(x=>x<20);(微软推荐,其实就是Lambda表达式..) Linq查询结果可能是,单一的值,也可能是一个集合IEnumerable。需要注意的是,每次使用到IEnumerable的时候,linq就会自动查询一次,确保返回结果的真实性。 4.查询表达式的结构
(1)from :指定了作为数据源的集合(从上图可以看出,可以有多个数据源)
基本结构: from Type Item in Items 其中type可省略,因为编辑器会自动判断,item是元素名,items是集合名
var someInts=from a in groupA from b in groupB where a>4&&b<=8 select new{a,b,sum=a+b};
注意:from遍历的顺序并不固定。 (2)join:联结,可以通过联结来合并多个集合来生成一个新的临时集合 eq:如果有两个集合,一个集合保存了学生的id和name,另一个集合保存了学生id和科目,使用下面这个例子, 其中on后面的stID就是作为联结基础的学生ID,返回集合结果为 学生的名字对应了学生的科目
var query=from s in students join c in studentsInCourses on s.StID equals c.StID (3)let:接受一个表达式的运算并且把它赋值给一个需要在其他运算中使用的标识符,作为一个中间表达式使用。
var groupA=new[]{3,4,5,6}; var groupA=new[]{6,7,8,9}; var someInts=from a in groupA from b in groupB let sum=a+b //在新的变量中保存结果 where sum==12 select new{a,b,sum}; (4)where:根据之后的运算来筛选指定项,可以有多个where
var groupA=new[]{3,4,5,6}; var groupA=new[]{6,7,8,9}; var someInts=from a in groupA from b in groupB let sum=a+b where sum>=11 ←条件1 where a==4 ←条件2 select new{a,b,sum}; (5)orderby:根据表达式按顺序返回结果项。,简单来说就是排序。默认升序
var query=from student in students orderby student.Age //对年龄进行了排序 select student;
(6)select…group:select用来选择哪部分数据被返回,group可以对数据进行分组(可选)
select有三种可能,返回整个数据项,比如上面的student,单个字段student.age,多个字段new(student.age,student.name)通过构造匿名类达成 group :
var query=from s in students group s by s.Major; 根据一个字段,对数据进行分类,这时候返回的集合,不再是直接包含所有的数据,而是被分组保存在更多地集合中,这些子集合通过key来获得名字
foreach(var s in query) { Console.WriteLine("{0}",s.Key); foreach(var t in s) { Console.WriteLine(" {0},{1}",t.LName,t.FName); } } (7)into:查询延续,可以接受查询的一部分结果并赋予一个名字,从而可以在查询的另一部分中使用。
var someInts=from a in groupA join b in groupB on a equals b into groupAandB //连接groupA和groupB并命名为groupAandB from c in groupAandB
select c; 5.谓词,专用于集合(IEnumerable)
一般使用方式有两种
public static int Count(this IEnumerable source);
public static int Count(this IEnumerable source,Func predicate);//可以传入一个委托,对计算元素进行限制 最后,Linq还可以用于XML,这个之后用到了再看吧= = 记录一下比较详细的单贴: join和Groupjoin https://www.cnblogs.com/cncc/p/7985843.html System.Linq中函数构造的参数名含义 source 传入的源集合 func 不解释。。 seed 种子,一般指初始值 resultSelector 通过select得到的最终集合 predicate 对于结果的筛选 selector 对于输入源的筛选 keySelector 关联属性的描述 resultSelector 结果筛选 elementSelector 元素筛选