从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;
let关键字:在查询中定义变量。
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}; }
从LinqPad入门Linq的更多相关文章
- 使用 LINQPad 助力 LINQ 学习
简介一图示意 简介 LINQPad 是一款学习 LINQ,优化 SQL 的好助手. 它的一大特点是内置了新版<C# in a Nutshell>的全部 LINQ 示例,不管是配合原书进行练 ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- linq 动态组合条件
http://www.albahari.com/nutshell/predicatebuilder.aspx Dynamically Composing Expression Predicates S ...
- [Json.net]Linq to Json
引言 上篇学习了json.net的基本知识,这篇学习linq to json. 上篇文章:[Json.net]快速入门 Linq to Json Linq to Json是用来快速操作json对象的, ...
- 构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转
一:linq的话我们可能会遇到两个问题: 1. 我们的linq出现性能低下的时候,如果优化???? 我们写的linq所生成的sql是无法控制的... (要做性能优化,必须预先知道sql会生成啥样的?? ...
- LINQPad 应用
https://www.linqpad.net/ 使用 LINQPad 调试linq以及lambda表达式 http://www.studyofnet.com/news/1168.html linq ...
- EntityFramework优缺点(转)
Entity Framework 是微软推荐出.NET平台ORM开发组件, 现在已放源代码. 以下我们来讨论一下优缺点和一些问题, 以下简称EF. 有兴趣可查询官网的Entity Framewo ...
- 推荐几个对Asp.Net开发者比较实用的工具 2
推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 作为程序员要有挑战精神,大家可以尝试一下这些工具. 已经有篇文章写到了vs的扩展工具,这里不再累赘,请查 ...
随机推荐
- IOS-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34 阅读:533 评论:0 收藏:0 [点我收藏+] ...
- XML——概述
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- junit里面Test Case的执行顺序
这里讨论的是junit在ant运行的情况,其他build工具应该也适用,但具体没试验过. 首先运行junit时是按照脚本中文件夹的顺序执行,如下脚本会先执行test1目录下的测试,其实是test2目录 ...
- Sonar在ant工程中读取单元测试和覆盖率报告
虽然sonar支持ant工程的构建,但目前最大的不足是无法在分析过程中产生单元测试和覆盖率报告,这样在sonar面板上覆盖率板块就始终没有数据.但幸运的是,sonar可以读取已经生成好的报告,让报告的 ...
- Internet Explorer 11.0.9600.16428 For Windows 7
官方消息http://blogs.msdn.com/b/ie/archive/2013/11/07/ie11-for-windows-7-globally-available-for-consumer ...
- 201621123006 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- 这是C语言结课前(期末考试之前)写给牛晓霞的一封信!
致尊敬的牛晓霞老师: 这是黄领衫的感想,也是想告诉你的话! 在老师说要给班里写得好的人发黄领衫的时候,我当时的想法是我很有可能拿到这份奖品的,怎么说呢,算是一种自信吧,或是对自己的态度的认可.虽然我能 ...
- Tomcat启动 Unable to process Jar entry [javassist/XXXXXX.class]
例如: 03-Mar-2017 17:01:45.864 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.startup.Co ...
- 7-31 The World's Richest(25 分)
Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...
- python 用 __all__ 暴露接口
非常典型的python的用法 refer to : http://python-china.org/t/725