从LinqPad入门Linq
为什么要学习Linq?
在我们日常开发中,经常需要从数据库中执行各式各样的查询来获取需要的数据。但是如果需要对查询获得的数据进行二次筛选呢?linq就提供了对于可枚举类型(实现IEnumerable接口)的一种便捷查询方式。正如其名Language Integrated Query语言集成查询。
下载LinqPad
LinqPad官方网站http://www.linqpad.net/,此篇示例使用的是LinqPad4。
安装完成后界面如下:
点击左侧Add connection,添加数据库连接,本机是sqlserver 2008 R2,选择默认的LINQ to SQL,NEXT,选择你想要添加的数据库,点击OK即可添加成功。
展开你连接的库树,表,存储过程,方法等都能够在视图中展示(如果数据库存在架构,表存放在其所属架构下)。
所有的表展开后都成为了”表名s”的格式,体现了Linq查询将表当做数据的集合的思想。
Linq的语法
右键选中其中一个集合弹出菜单。
分割线上:Take/Count/Where均是Qureyable方法(查询方法),以及两个查询模板。
分割线下:查询或编辑数据。
这里我们选择第一个模板
代码编辑窗口出现如下代码,这是一个比较直观的Linq语句模板
from p in Persons where p. select p
Language→C# Program 并将其补充完整为我们在.Net开发中经常用到的C#代码块格式。
void Main() { var result = from p in Persons where p.MiddleName == "A" select p; result.Count().Dump();//输出结果个数 }
以此为基础,可以对Linq语句进行扩展
- 所有的linq查询都是以from开始,select或group结束。
- p是范围变量,Persons是数据集合。
- where关键字后是查询条件,可以同时存在多个where
补充:有时编译器不能够识别自定义类型,可以显式指定范围变量的类型。如:from Person p in Persons。
where p.MiddleName=="A" where p.Title=="Mr." //等同于 where p.MiddleName=="A"&&where p.Title=="Mr."
指得注意的是,var是推断类型,C#3.0新出的特性。编译器编译的过程中推断变量是什么类型,和所谓的强弱类型无关。(很多人说var是弱类型,这个是错误的)。
比如,下图编译器推断dr为Object类型,无法通过索引器去访问,编译时报错。
更改为DataRow后编译通过
PS: 既然是在编译过程中推断而不是运行时,所以就没有效率高低之分。但是为了代码的易读性和巩固基础,少用为好。
排序orderby:
var result=from p in Persons where p.MiddleName=="A" orderby p.EmailPromotion //默认升序,降序descending select p;
分组group by:
var result=from p in Persons where p.MiddleName=="A" group p by p.Title;
select关键字:在查询中定义变量。
into关键字:将查询结果放入一个变量,再次使用。
var result=from p in Persons let midname=p.MiddleName where midname=="A"|| midname=="J" group p by p.Title into temp where temp.Count()>1 select temp;
join关键字:内连接,左连接,右连接。此处用到了linq to sql
void KeyWordJoin() { DataContext ctx = new DataContext(); //内连接 var innerJoin = from p in ctx.Person where p.BusinessEntityID == 9 join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID select p; //左连接 var leftJoin = from p in ctx.Person join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID into joined from j in joined.DefaultIfEmpty() //join操作后,返回的集合为在后方的类型此处为Customer select new { ID = p.BusinessEntityID, Number = j == null ? null : j.AccountNumber }; //右连接同理 var rightJoin = from c in ctx.Customer join p in ctx.Person on c.CustomerID equals p.BusinessEntityID into joined from j in joined.DefaultIfEmpty() select new { ID = c.CustomerID, Last = j == null ? null : j.LastName}; }
作者:SuperRaccoon
出处:http://www.cnblogs.com/Geronimo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
推崇原创或用自己的语言加以总结。创造干货,收获干货。