linq入门
只要是集合都可以用linq查询的,(必须支持Ienumerable接口)比如对象,数据库,xml,实体数据模型,外部应用程序等等,省写很多代码。
指定数据源:from子句
指定条件:where子句(限制运算符)
指定元素:select子句
Foreach循环实际上并不是linq的一部分,只是迭代结果,不过它是实际执行查询的代码,查询结果变量仅保存了执行查询计划,在访问查询结果之前,并没有提取linq数据,此之谓查询的延迟也
查询语法是首选方式,很直观,当然也可以用方法语法(lambda表达式什么的)
排序用orderby子句,默认顺序,倒叙要加个descending 在后面
Linq提供了一组聚合运算符可以用于分析查询的结果:
Count() 结果的个数
Min() 结果中的最小值
Max() 结果中的最大值
Average() 数字结果的平均值
Sum() 所有数字结果的总和
Aggregate()累加
聚合运算符返回一个简单的标量类型,而不是一系列结果,所以会立即执行查询
查询复杂的集合时,可能需要在查询中创建新对象,与sql不同,linq中的select不能选取多个字段,所以需要动态创建新对象来保存查询的结果(匿名类的语法)
单值选择查询 在结果集上用.distinct()
另一类查询是确定数据是否满足某个条件,linq提供2个布尔方法:Any()和All()
多级排序,在orderby后跟多个字段,或用方法语法thenby()
组合查询:
Var queryResults=
From c in customers
Group c by c.region into cg
Select new {total=cg.sum(c=>c.salses),region=cg.key};
Take()和skip()运算符,这是分区运算符,take只取结果集的前n个结果,类似sql server中的 top,而skip正相反
Linq通过first()方法返回结果集中第一个匹配给定条件的元素,还可以用firstOrDefault()
集运算符有:union(),intersect(),except()。
集运算符要求成员有相同的类型,才能确保得到希望的结果
而join查询就方便多了,专门处理不同对象。例如:
Var queryResults=
From c in customers
join o in orders on c.id equals o.id
Select new {c.id,c.city,salesBefore=c.sales,neworder=o.amount};
也可以这样:
From c in customers
From o in orders
Where c.id==o.id
Linq 的变体:
Linq to objects
Linq to XML
Linq to ADO.NET(entities,dataset,sql,pLinq)
使用linq to entities 类的第一步是为要访问的数据库创建objectContext对象的一个实例,这是在数据源中创建的.edmx文件的编译类,这个对象是数据库的网关,提供了在程序中控制它的所有方法,还是创建业务对象的工厂
Linq to XML 为创建和查询XML数据提供了额外的选项,开发速度加快
Xdocument doc=new xdocument(
new xelement(“customers”,
new xelement(“customer”,…),new xelement(“customer”,…)));
保存save()和加载load()xml文档
从字符串中加载xml 可以使用parse()方法。
如果想改变xml文档的编码格式,可以在构造的时候添加一个XDeclaration()对象在参数列表开头,或者设置XDocument 的Declaration属性
处理xml片段和处理整个文档一样(根为xelement对象),只是有些节点不可添加,比如注释,声明,处理指令什么的
从数据库中生成XML:
Xdocument doc=new xdocument(
new xelement(“customers”,
from c in xxx.xxx.AsEnumerable()
select new xelement(“customer”,
new xattribute(“id”,c.customerid),
new xattribute(“city”,c.city))
));
查询xml成员:
Elements()返回xml文档或片段中的所有第一级元素,对于有效的xml文档只有一个第一级元素
Descendants() 返回xml文档或片段中的所有子元素(所有级别的子元素)
Linq to xml 还提供了一个Ancestors()方法,它与Descendants()正相反,只为完整计。
Attributes()返回当前选中元素的所有特性,和descendants()一样可以传送要搜索的具体名称